La Integer
clase tiene un caché estático, que almacena 256 Integer
objetos 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 Integer
objeto.
Integer.parseInt("123");
Esto devuelve un int
valor 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 Integer
cuyo valor es 127 se recupera dos veces del caché estático y se compara con sí mismo. Solo hay un Integer
objeto 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 Integer
se crea una nueva para cada lado de la igualdad. Dado que hay dos Integer
objetos diferentes , y ==
para los objetos solo se devuelve true
si ambos lados son exactamente el mismo objeto, esto será false
.
Integer.parseInt("128")==Integer.valueOf("128");
Esto es comparar el int
valor primitivo 128 a la izquierda, con un Integer
objeto recién creado a la derecha. Pero debido a que no tiene sentido comparar un int
an Integer
, un Java desempaquetará automáticamente el Integer
antes de hacer la comparación; entonces terminas comparando una int
con una int
. Como el primitivo 128 es igual a sí mismo, esto vuelve true
.
.equals()
, de lo contrario todas las apuestas están canceladas.