que - Prueba de igualdad de Java Wrapper
wrapper int (5)
public class WrapperTest {
public static void main(String[] args) {
Integer i = 100;
Integer j = 100;
if(i == j)
System.out.println("same");
else
System.out.println("not same");
}
}
El código anterior proporciona la salida de same
cuando se ejecuta, sin embargo, si cambiamos el valor de i
y j
a 1000, la salida cambia a not same
. Mientras me preparo para SCJP, necesito aclarar el concepto detrás de esto. ¿Alguien puede explicar este comportamiento? Gracias.
Básicamente, los enteros entre -127 y 127 se ''almacenan en caché'' de tal forma que cuando usa esos números siempre se refiere al mismo número en la memoria, por lo que su ==
funciona.
Cualquier entero fuera de ese rango no se almacena en caché, por lo tanto, las referencias no son las mismas.
En Java, los enteros entre -128 y 127 (inclusive) están generalmente representados por la misma instancia de objeto Integer. Esto se maneja mediante el uso de una clase interna llamada IntegerCache (contenida dentro de la clase Integer, y usada, por ejemplo, cuando se llama Integer.valueOf (), o durante el autoboxing):
private static class IntegerCache {
private IntegerCache(){}
static final Integer cache[] = new Integer[-(-128) + 127 + 1];
static {
for(int i = 0; i < cache.length; i++)
cache[i] = new Integer(i - 128);
}
}
Ver también: http://www.owasp.org/index.php/Java_gotchas
Tu código no se compila. Esto es lo que obtengo:
Excepción en el hilo "principal" java.lang.Error: Problemas de compilación no resueltos: Tipo de discrepancia: no se puede convertir de entero a Entero Tipo de desajuste: no se puede convertir de entero a Entero
at WrapperTest.main(WrapperTest.java:5)
Las variables i y j son instancias de objeto Integer. No compare instancias de objetos usando el operador "==", use el método "igual" en su lugar.
Saludos
Tiene que ver con igualdad y autoboxing: http://web.archive.org/web/20090220142800/http://davidflanagan.com/2004/02/equality-and-autoboxing.html
@tunaranch es correcto. También es el mismo problema que en esta pregunta de Python . La esencia es que Java mantiene un objeto alrededor de los enteros de -128 a 127 (Python hace -5 a 256) y devuelve el mismo objeto cada vez que solicite uno. Si solicita un Entero fuera de este rango fijo, le dará un nuevo objeto cada vez.
(Recuerde que ==
devuelve si dos objetos son realmente iguales, mientras que los equals
comparan sus contenidos).
Editar : Aquí está el párrafo relevante de la Sección 5.1.7 de la Especificación del lenguaje Java :
Si el valor p que está siendo encasillado es
true
,false
, unbyte
, unchar
entre el rango/u0000
a/u007f
, o un número/u007f
o corto entre -128 y 127, entonces r1 y r2 serán los resultados de dos conversiones de boxeo de p. Siempre es el caso que r1 == r2 .
Tenga en cuenta que esto también describe lo que sucede con otros tipos.