variáveis - wrapper integer java




Quantos objetos são criados usando a classe de invólucro Integer? (4)

Integer i = 3; 
i = i + 1; 
Integer j = i; 
j = i + j; 

Quantos objetos são criados como resultado das instruções no código de exemplo acima e por quê? Existe algum IDE em que podemos ver quantos objetos são criados (talvez em um modo de depuração)?


A resposta estritamente correta é que o número de objetos Integer criados é indeterminado . Pode ser entre 0 e 3, ou 256 1 ou até mais 2 , dependendo do

  • a plataforma Java 3 ,
  • se esta é a primeira vez que este código é executado, e
  • (potencialmente) se outro código que depende do boxe de valores int corre antes dele.

Os valores Integer para -128 a 127 não são estritamente necessários para serem pré-computados . Na verdade, o JLS 5.1.7, que especificou a conversão do Boxing, diz o seguinte:

Se o valor p sendo encaixotado é um literal inteiro do tipo int entre -128 e 127 inclusive (§3.10.1) ... então seja aeb os resultados de quaisquer duas conversões de boxe de p. É sempre o caso que a == b.

Duas coisas a notar:

  • O JLS requer apenas isso para >> literais <<.
  • O JLS não exige o armazenamento em cache dos valores. O cache preguiçoso também satisfaz os requisitos comportamentais do JLS.

Mesmo o javadoc para Integer.valueof(int) não especifica que os resultados sejam armazenados em cache ansiosamente.

Se examinarmos o código-fonte do Java SE para java.lang.Integer do Java 6 a 8, fica claro que a estratégia atual de implementação do Java SE é pré-computar os valores. No entanto, por várias razões (ver acima), isso ainda não é suficiente para nos dar uma resposta definitiva à pergunta "quantos objetos".

1 - Pode ser 256 se a execução do código acima disparar a inicialização de classe para Integer em uma versão do Java em que o cache é ansiosamente inicializado durante a inicialização da classe.

2 - Pode ser ainda mais, se o cache for maior do que a especificação da JVM requer. O tamanho do cache pode ser aumentado por meio de uma opção da JVM em algumas versões do Java.

3 - Além da abordagem geral da plataforma para implementar o boxe, um compilador poderia detectar que parte ou todo o cálculo poderia ser feito em tempo de compilação ou otimizado completamente.

4 - Tal código poderia acionar a inicialização lenta ou tardia do cache inteiro.


A resposta, surpreendentemente, é zero.

Todos os Integer de -128 a +127 são pré-calculados pela JVM.

Seu código cria referências para esses objetos existentes .


Primeiro de tudo: A resposta que você está procurando é 0 , como os outros já mencionaram.

Mas vamos um pouco mais fundo. Como Stephen menthioned depende do tempo que você o executa. Porque o cache é realmente inicializado com preguiça.

Se você olhar a documentação do java.lang.Integer.IntegerCache:

O cache é inicializado no primeiro uso.

Isso significa que, se é a primeira vez que você chama qualquer Integer que você realmente cria:

  • 256 objetos inteiros (ou mais: veja abaixo)
  • 1 Objeto para o Array armazenar os inteiros
  • Vamos ignorar os objetos necessários para armazenar a classe (e métodos / campos). De qualquer forma, eles são armazenados no metaspace.

Da segunda vez em que você os chama, você cria 0 Objetos.

As coisas ficam mais engraçadas quando você aumenta um pouco os números. Por exemplo, pelo seguinte exemplo:

Integer i = 1500; 

As opções válidas são: 0, 1 ou qualquer número entre 1629 a 2147483776 (dessa vez contando apenas os valores inteiros criados. Por quê? A resposta é dada na próxima sentença da definição de cache inteiro:

O tamanho do cache pode ser controlado pela opção -XX: AutoBoxCacheMax =.

Então você pode variar o tamanho do cache que é implementado.

O que significa que você pode alcançar a linha acima:

  • 1: novo Objeto se seu cache for menor que 1500
  • 0: novos objetos se seu cache foi inicializado antes e contém 1500
  • 1629: new (Integer) - Objetos se seu cache está configurado para exatamente 1500 e ainda não foi inicializado. Então valores inteiros de -128 a 1500 serão criados.
  • Como na sentença acima você atinge qualquer quantidade de inteiro Objetos aqui até: Integer.MAX_VALUE + 129, que é o mencionado: 2147483776.

Tenha em mente: Isso só é garantido no Oracle / Open JDK (verifiquei as versões 7 e 8)

Como você pode ver, a resposta completamente correta não é tão fácil de obter. Mas apenas dizer 0 fará as pessoas felizes.

PS: usando o parâmetro menthoned pode fazer a seguinte declaração true: Integer.valueOf(1500) == 1500


Você pode depurar o método Integer.valueOf (int i) para descobrir por si mesmo. Esse método é chamado pelo processo de autoboxing pelo compilador.







wrapper