Esto funciona también ("en mi máquina"):
Integer a = 128, b = 128;
mientras que esto no va a funcionar:
Integer a = 127, b = 127;
Auto-boxing un int
es el azúcar sintáctica para una llamada a Integer.valueOf(int)
. Esta función usa una memoria caché para valores de -128 a 127, inclusive. Es puede caché de otros valores, pero en mi caso, no es así.
Por lo tanto, la asignación de 128 no tiene un golpe de caché; crea una nueva instancia de Integer
con cada operación de autoenlace, y la comparación de referencia a != b
es verdadera. La asignación de 127 tiene un valor de caché, y los objetos resultantes Integer
son en realidad la misma instancia de la memoria caché. Entonces, la comparación de referencia a != b
es falsa.
Lo que realmente quiero señalar es tener cuidado con la comparación de referencia con el auto-boxeo. Un problema más probable en el mundo real es que esperas que a == b
sea cierto porque se les asignó el mismo valor (automático), ejecutas algunas pruebas de unidad que confirman tus expectativas y luego tu código falla "en la naturaleza" cuando algún contador excede el límite superior de la memoria caché. ¡Tiempos divertidos!
donde estoy? ... – Kasturi
@DJClayworth ¿Qué quiere decir con "' || 'versión?" –
@ Alan, muy buena pregunta +1 – ELAYARAJA