A Integerclasse possui um cache estático, que armazena 256 Integerobjetos 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 Integerobjeto.
Integer.parseInt("123");
Isso retorna um intvalor 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 Integervalor cujo é 127 é recuperado duas vezes do cache estático e comparado a si mesmo. Há apenas um Integerobjeto 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 Integerobjetos diferentes , e ==para os objetos retornará apenas truese os dois lados forem exatamente o mesmo objeto, será esse o caso false.
Integer.parseInt("128")==Integer.valueOf("128");
Isso está comparando o intvalor primitivo 128 à esquerda, com um Integerobjeto recém-criado à direita. Mas, como não faz sentido comparar um intcom um Integer, o Java descompactará automaticamente o Integerantes 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.