A Integer
classe possui um cache estático, que armazena 256 Integer
objetos especiais - um para cada valor entre -128 e 127. Com isso em mente, considere a diferença entre esses três.
new Integer(123);
Isso (obviamente) cria um novo Integer
objeto.
Integer.parseInt("123");
Isso retorna um int
valor primitivo após analisar o String
.
Integer.valueOf("123");
Isso é mais complexo que os outros. Começa analisando o arquivo String
. Então, se o valor estiver entre -128 e 127, ele retornará o objeto correspondente do cache estático. Se o valor estiver fora desse intervalo, ele chamará new Integer()
e passará o valor, para que você obtenha um novo objeto.
Agora, considere as três expressões na pergunta.
Integer.valueOf("127")==Integer.valueOf("127");
Isso retorna true, porque o Integer
valor cujo é 127 é recuperado duas vezes do cache estático e comparado a si mesmo. Há apenas um Integer
objeto envolvido, então isso retorna true
.
Integer.valueOf("128")==Integer.valueOf("128");
Isso retorna false
, porque 128 não está no cache estático. Portanto, um novo Integer
é criado para cada lado da igualdade. Como existem dois Integer
objetos diferentes , e ==
para os objetos retornará apenas true
se os dois lados forem exatamente o mesmo objeto, será esse o caso false
.
Integer.parseInt("128")==Integer.valueOf("128");
Isso está comparando o int
valor primitivo 128 à esquerda, com um Integer
objeto recém-criado à direita. Mas, como não faz sentido comparar um int
com um Integer
, o Java descompactará automaticamente o Integer
antes de fazer a comparação; então você acaba comparando umint
para um int
. Como o primitivo 128 é igual a si mesmo, isso retorna true
.
.equals()
, caso contrário, todas as apostas estão desativadas.