2009-01-19 8 views
19
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 muestra el resultado de same cuando es ejecutado, sin embargo, si cambiamos el valor de i y j a 1000 El salida cambia a not same. Mientras me preparo para SCJP, necesito aclarar el concepto detrás de esto. ¿Alguien puede explicar este comportamiento? Gracias.Java Envoltura prueba de igualdad

+0

Pregunta muy interesante, y no sabía que Java se comportara de esta manera. Tiendo a usar equals() siempre que puedo, así que he tenido la suerte de evitar este problema. – moffdub

Respuesta

19

En Java, los enteros entre -128 y 127 (inclusive) están generalmente representados por la misma instancia de objeto Integer. Esto es manejado por el uso de una clase interna llamada IntegerCache (contenida dentro de la clase Integer, y se utiliza por ejemplo, cuando se llama Integer.valueOf(), o durante 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

5

@tunaranch es correcta. También es el mismo problema que en este Python question. 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.

(Recordemos que == devuelve si dos objetos son realidad la misma, mientras que equals compara su contenido.)

Edición: Aquí está el apartado correspondiente de la Section 5.1.7 de la Java Language Specification:

If the value p being boxed is true , false , a byte , a char in the range \u0000 to \u007f , or an int or short number between -128 and 127, then let r1 and r2 be the results of any two boxing conversions of p. It is always the case that r1 == r2.

Tenga en cuenta que esto también describe lo que sucede con otros tipos.

6

Básicamente, los enteros entre -127 y 127 se 'almacenan en caché' de 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.

0

Tu código no se compila. Esto es lo que consigo:

Exception in thread "main" java.lang.Error: Unresolved compilation problems: Type mismatch: cannot convert from int to Integer Type mismatch: cannot convert from int to Integer

at WrapperTest.main(WrapperTest.java:5) 

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

+0

Supongo que estás usando Java 1.4 ... inténtalo con Java 1.5 – Warrior

+0

gracias, tienes razón :-) – sourcerebels