Me deparei com um problema com a classe Integer, e não entendi o porque acontece:
Integeri=127;Integerj=127;system.out.println(i==j)//isso aqui é igual a true;Integeri=128;Integerj=128;system.out.println(i==j)//isso aqui é igual a false;
Segundo a API, para todas classes Wrapper, dois objetos com o mesmo tipo e com valores iguais serão iguais.
Alguém se habilita a explicar o por que de quando compara 128 pra cima o resultado é false?
Um detalhe de implementação da JVM da Sun* faz com que um array de wrappers cujos valores vão de -128 até +127 seja criado para os tipos java.lang.Integer, java.lang.Long, java.lang.Short, e java.lang.Byte. Esse array é usado por valueOf. Então, quando você faz:
Quando você olhar o fonte de valueOf, vai ver que ele pega os valores predefinidos se o número estiver entre -128 e +127, e cria um novo wrapper se estiver fora desse intervalo.
Como isso é detalhe de implementação não deveria cair na prova. Pelo menos na minha não caiu.
Se não cai na prova, ótimo. Mas valeu o conhecimento.
robson_costa
thingol para o tipo java.lang.Long tambem é criado o array?
no livro da kathy sierra fala tambem do tipo Character cujos valores primitivos vao de \u0000 até \u007f (0 até 127 em decimal).
marcosbrandao
robson_costa:
thingol para o tipo java.lang.Long tambem é criado o array?
no livro da kathy sierra fala tambem do tipo Character cujos valores primitivos vao de \u0000 até \u007f (0 até 127 em decimal).
segundo o link que eu passei:
The following is the list of primitives stored as immutable objects:
Hum, dei uma checada no fonte do JDK 1.7 (Dolphin), e ele também define essa otimização para java.lang.Long (não vi o fonte do Java 5.0 ou do 6.0).
. Não sabia que essa otimização era definida para java.lang.Character.
marlon_patrick
No livro da Katy fala sobre essa questão…
então como ja foi dito acima…
se utilizarmos o operador == para comparar Integers com valor no intervalo de
-128 a 127…serao considerados iguais sempre…
fora dele sao diferentes…
portanto é sempre melhor utilizar o metodo equals.