La Integerclase tiene un caché estático, que almacena 256 Integerobjetos especiales , uno para cada valor entre -128 y 127. Con eso en mente, considere la diferencia entre estos tres.
new Integer(123);
Esto (obviamente) hace un nuevo Integerobjeto.
Integer.parseInt("123");
Esto devuelve un intvalor primitivo después de analizar el String.
Integer.valueOf("123");
Esto es más complejo que los demás. Comienza analizando el String. Luego, si el valor está entre -128 y 127, devuelve el objeto correspondiente de la caché estática. Si el valor está fuera de este rango, invoca new Integer()y pasa el valor, para que obtenga un nuevo objeto.
Ahora, considere las tres expresiones en la pregunta.
Integer.valueOf("127")==Integer.valueOf("127");
Esto devuelve verdadero, porque Integercuyo valor es 127 se recupera dos veces del caché estático y se compara con sí mismo. Solo hay un Integerobjeto involucrado, así que esto regresa true.
Integer.valueOf("128")==Integer.valueOf("128");
Esto vuelve false, porque 128 no está en el caché estático. Entonces Integerse crea una nueva para cada lado de la igualdad. Dado que hay dos Integerobjetos diferentes , y ==para los objetos solo se devuelve truesi ambos lados son exactamente el mismo objeto, esto será false.
Integer.parseInt("128")==Integer.valueOf("128");
Esto es comparar el intvalor primitivo 128 a la izquierda, con un Integerobjeto recién creado a la derecha. Pero debido a que no tiene sentido comparar un intan Integer, un Java desempaquetará automáticamente el Integerantes de hacer la comparación; entonces terminas comparando una intcon una int. Como el primitivo 128 es igual a sí mismo, esto vuelve true.
.equals(), de lo contrario todas las apuestas están canceladas.