class D {
public static void main(String args[]) {
Integer b2=128;
Integer b3=128;
System.out.println(b2==b3);
}
}
Salida:
false
class D {
public static void main(String args[]) {
Integer b2=127;
Integer b3=127;
System.out.println(b2==b3);
}
}
Salida:
true
Nota: los números entre -128 y 127 son verdaderos.
Respuestas:
Cuando compila un número literal en Java y lo asigna a un entero (capital
I
), el compilador emite:Esta línea de código también se genera cuando usa autoboxing.
valueOf
se implementa de tal manera que ciertos números se "agrupan" y devuelve la misma instancia para valores menores que 128.Desde el código fuente de java 1.6, línea 621:
El valor de
high
se puede configurar en otro valor, con la propiedad del sistema.Si ejecuta su programa con esa propiedad del sistema, ¡saldrá verdadero!
La conclusión obvia: nunca confíes en que dos referencias sean idénticas, siempre compáralas con el
.equals()
método.Entonces
b2.equals(b3)
imprimirá verdadero para todos los valores lógicamente iguales de b2, b3.Tenga en cuenta que el
Integer
caché no está allí por razones de rendimiento, sino más bien para cumplir con el JLS, sección 5.1.7 ; Se debe dar identidad de objeto para los valores -128 a 127 inclusive.Integer # valueOf (int) también documenta este comportamiento:
fuente
false
. En realidad, esto puede suceder hoy, como un efecto secundario de la aplicación de Análisis de escape y Reemplazo escalar.Almacenamiento automático en caché -128 a 127. Esto se especifica en JLS ( 5.1.7 ).
Una regla simple para recordar cuando se trata de objetos es: úselo
.equals
si desea verificar si los dos objetos son "iguales", úselo==
cuando quiera ver si apuntan a la misma instancia.fuente
El uso de tipos de datos primitivos, ints, produciría verdadero en ambos casos, la salida esperada.
Sin embargo, dado que está utilizando objetos Integer, el operador == tiene un significado diferente.
En el contexto de los objetos, == verifica si las variables se refieren a la misma referencia de objeto.
Para comparar el valor de los objetos, debe usar el método equals () Ej.
que indicará si b2 es menor que b1, mayor o igual que (consulte la API para obtener más detalles)
fuente
Es optimización de memoria en Java relacionado.
fuente
Eche un vistazo a Integer.java, si el valor está entre -128 y 127, usará el grupo en caché, por lo
(Integer) 1 == (Integer) 1
tanto , mientras(Integer) 222 != (Integer) 222
fuente
Otras respuestas describen por qué se pueden observar los efectos observados, pero eso no tiene nada que ver con los programadores (interesante, sin duda, pero algo que debes olvidar al escribir el código real).
Para comparar objetos enteros para igualdad, use el
equals
métodoNo intente comparar objetos enteros para igualdad utilizando el operador de identidad,
==
.Puede suceder que algunos valores iguales sean objetos idénticos, pero esto no es algo en lo que generalmente se deba confiar.
fuente
Escribí lo siguiente ya que este problema no es solo específico de Integer. Mi conclusión es que, la mayoría de las veces, si usa la API incorrectamente, verá un comportamiento incorrecto. Úselo correctamente y debería ver el comportamiento correcto:
fuente