O retorno esperado pra isso seria, na minha opinião:
true
true
false
false
Entretanto, isso retorna:
true
false
true
false
(1) 127 == 127 (true)
(2) 128 == 128 (false) ???
(3) Integer a e Integer b não fazem referência para o mesmo objeto. a == b (true) ???
(4) Objetos c e d não fazem referência para o mesmo objeto. Portanto: c == d (false)
Alguém pode me dar uma explicação plausível.
Eu utilizei o javap pra disassemblar o código da classe mas ainda assim não encontrei uma explicação interessante.
Tenho lido a JVM specs e quem sabe não encontro algo?
classTesteAutoboxing{publicstaticvoidmain(Stringargs[]){intx=127;inty=127;// A linha a seguir equivale a equal(Integer.valueOf(127), Integer.valueOf(127).// Na implementação corrente da Sun, Integer.valueOf(127) retorna um objeto Integer// presente no cache estático de java.lang.Integer, então equal retorna true.System.out.println(equal(x,y));// trueintw=128;intz=128;// A linha a seguir equivale a equal(Integer.valueOf(128), Integer.valueOf(128).// Na implementação corrente da Sun, Integer.valueOf(128) retorna um novo objeto// Integer, já que o cache só contém elementos de -128 a +127, então há 2 objetos// distintos e equal retorna false.System.out.println(equal(w,z));// As linhas a seguir são equivalentes a a = Integer.valueOf(3) e b = Integer.valueOf (3).Integera=3;Integerb=3;// Na implementação corrente da Sun, Integer.valueOf(3) retorna um objeto Integer// presente no cache estático de java.lang.Integer, então equal retorna true.System.out.println(equal(a,b));// Note que a seguir estamos explicitamente criando 2 novos objetos Integer, então equal retorna false.Integerc=newInteger(1);Integerd=newInteger(1);System.out.println(equal(c,d));}/** Compara x e y e verifica se são o mesmo objeto, usando == */publicstaticbooleanequal(Integerx,Integery){return(x==y);}}
T
thingol
Só vou dizer uma coisa: saber que um valor submetido a autoboxing (ou a .valueOf()) pode ser obtido do cache ou não, dependendo se está no intervalo -128 a +127, não é para cair na prova.
E é um detalhe de implementação; tanto é que no próximo update da versão 6, esse intervalo vai poder ser alterado pelo usuário dependendo de um parâmetro da JVM.
nadilsons
A explicação está no método valueOf da Classe Integer
publicstaticIntegervalueOf(inti){finalintoffset=128;if(i>=-128&&i<=127){// must cache returnIntegerCache.cache[i+offset];}returnnewInteger(i);}
nadilsons
thingol:
E é um detalhe de implementação; tanto é que no próximo update da versão 6, esse intervalo vai poder ser alterado pelo usuário dependendo de um parâmetro da JVM.
Olá Thingol,
Onde se pode ter acesso a estas informações?
[]s
hiram
Obrigado Thingol.
A minha pergunta é a mesma. Qual a fonte dessas informações?
Quanto ao cache, isso foi mostrado em vários artigos da época em que o Java 5.0 estava introduzindo essa parte de “autoboxing”. Não sei lhe indicar um artigo desses.