A partir de Java 1.5, se puede casi el intercambio Integer
con int
en muchas situaciones.
Sin embargo, encontré un posible defecto en mi código que me sorprendió un poco.
El siguiente código:
Integer cdiCt = ...;
Integer cdsCt = ...;
...
if (cdiCt != null && cdsCt != null && cdiCt != cdsCt)
mismatch = true;
parecía estar configurando incorrectamente la falta de coincidencia cuando los valores eran iguales, aunque no puedo determinar en qué circunstancias. Establecí un punto de interrupción en Eclipse y vi que los Integer
valores eran 137, e inspeccioné la expresión booleana y dijo que era falsa, pero cuando la pasé, estaba configurando la falta de coincidencia en verdadero.
Cambiar el condicional a:
if (cdiCt != null && cdsCt != null && !cdiCt.equals(cdsCt))
Se solucionó el problema.
¿Alguien puede arrojar algo de luz sobre por qué sucedió esto? Hasta ahora, solo he visto el comportamiento en mi host local en mi propia PC. En este caso particular, el código superó con éxito unas 20 comparaciones, pero falló en 2. El problema fue reproducible de manera consistente.
Si es un problema frecuente, debería estar causando errores en nuestros otros entornos (desarrollo y prueba), pero hasta ahora, nadie ha informado el problema después de cientos de pruebas que ejecutan este fragmento de código.
¿Todavía no es legítimo usar ==
para comparar dos Integer
valores?
Además de todas las respuestas detalladas a continuación, el siguiente enlace stackoverflow tiene bastante información adicional. En realidad, habría respondido a mi pregunta original, pero como no mencioné el autoboxing en mi pregunta, no apareció en las sugerencias seleccionadas:
¿Por qué el compilador / JVM no puede hacer que el autoboxing "simplemente funcione"?
No puedes comparar dos
Integer
con un simple==
objetos, por lo que la mayoría de las veces las referencias no serán las mismas.Hay un truco, con
Integer
entre -128 y 127, las referencias serán las mismas que las del autoboxingInteger.valueOf()
que almacena enteros pequeños.Recursos:
Sobre el mismo tema:
fuente
new Integer(1) == new Integer(1)
sigue siendo falsonew ... == new ...
es siemprefalse
.equals()
cuando se trata de objetos. Esta debería ser una de las primeras cosas que uno debe saber al aprender Java. Por cierto, habría adivinado que el constructor deInteger
era privado, es decir, que las instancias siempre se creaban a través delvalueOf()
método. Pero veo que el constructor es público.El problema es que sus dos objetos Integer son solo eso, objetos. No coinciden porque está comparando sus dos referencias de objeto, no los valores dentro. Obviamente,
.equals
se anula para proporcionar una comparación de valores en lugar de una comparación de referencia de objeto.fuente
Integer
se refiere a la referencia, es decir, al comparar referencias que está comparando si apuntan al mismo objeto, no al valor. Por lo tanto, el problema que estás viendo. La razón por la que funciona tan bien con losint
tipos simples es que desempaqueta el valor contenido enInteger
.¿Puedo agregar que si está haciendo lo que está haciendo, por qué tener la
if
declaración para comenzar?fuente
"==" siempre compara la ubicación de la memoria o las referencias a objetos de los valores. método igual siempre compara los valores. Pero igual también usa indirectamente el operador "==" para comparar los valores.
Integer utiliza la memoria caché de Integer para almacenar los valores de -128 a +127. Si el operador == se usa para verificar cualquier valor entre -128 a 127, entonces devuelve verdadero. para otros que no sean estos valores devuelve falso.
Consulte el enlace para obtener información adicional
fuente
Además de la exactitud del uso
==
, puede desempaquetar uno de losInteger
valores comparados antes de hacer la==
comparación, como:El segundo se desempaquetará automáticamente (por supuesto,
null
primero debe verificar si hay s).fuente
Además de estas excelentes respuestas, lo que he aprendido es que:
fuente