2012-08-30 6 views
5

posible duplicado:
Integer wrapper objects share the same instances only within the value 127?
How != and == operators work on Integers in Java?resultado inesperado cuando Ints comparan

Me trataron de comparar dos enteros con los siguientes casos y tiene resultados inesperados

  1. cuando hice el siguiente wing, @@@ fue impreso.

    class C { 
        static Integer a = 127; 
        static Integer b = 127; 
        public static void main(String args[]){ 
        if(a==b){ 
         System.out.println("@@@"); 
        } 
        } 
    } 
    
  2. cuando hice lo siguiente, @@@ no se imprimió.

    class C { 
        static Integer a = 145; 
        static Integer b = 145; 
        public static void main(String args[]){ 
        if(a==b){ 
         System.out.println("@@@"); 
        } 
        } 
    } 
    

Puede alguien decirme lo que podría ser la razón.

+0

Si alguien puede formatear it..I no soy capaz de ... – Rookie

+4

posible duplicado de objetos envolventes [Integer comparten los mismos casos sólo dentro de el valor 127?] (http://stackoverflow.com/questions/5117132/integer-wrapper-objects-share-the-same-instances-only-within-the-value-127) y [New Integer vs valueOf] (http://stackoverflow.com/questions/2974561) y [Comportamiento incoherente en java ==] (http://stackoverflow.com/questions/1148805) y [los objetos contenedores de enteros comparten las mismas instancias solo dentro del valor 127?] (http://stackoverflow.com/questions/5117132) y ... –

+2

Más detalles si está interesado http://vanillajava.blogspot.co.uk/2012/01/surprising-results-of-autoboxing.html –

Respuesta

8

Está comparando las identidades de los objetos. Para valores inferiores a 128, la clase Entero almacena en caché sus objetos. Es por eso que es igual en el primer ejemplo. El otro ejemplo es con valores más altos que no están en la memoria caché.

Como @niklon señaló que también hay un borde inferior de -128 para el almacenamiento en caché.

El borde superior se puede ajustar con un VM arg -Djava.lang.Integer.IntegerCache.high=4711.

Para leer en el blog interesante de Pedro: http://vanillajava.blogspot.co.uk/2012/01/surprising-results-of-autoboxing.html

+0

¿Eso sucede con todas las demás clases de envoltura también? –

+1

Por cierto, el límite inferior para la caché de enteros es -128. – niklon

+1

@niklon, este es un detalle de implementación. El [Javadoc] (http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#valueOf%28int%29) dice "Este método siempre guardará en caché los valores en el rango -128 a 127, inclusive, ** y puede almacenar en caché otros valores fuera de este rango. ** " –

5

No está comparando int s, está comparando objetos para la igualdad de referencia. Use .equals, o use el tipo int en lugar de Object.

+1

/Entonces, ¿por qué está imprimiendo "@@@" en el primer caso ...? – Rookie

+2

@Raghav, porque muchas versiones de Java [memoize small 'Integer's] (http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#valueOf%28int%29) : "Este método siempre almacenará en caché los valores en el rango -128 a 127, inclusive, y puede almacenar en caché otros valores fuera de este rango". –

1

Aquí está utilizando Integer objetos en comparación con int primitives. Por lo tanto, debe comparar las dos instancias con .equals(...) a diferencia de ==. Si utilizó el tipo primitivo en cambio, usaría ==.

Es importante señalar que, cuando se trata de objetos, == compara las referencias de los dos objetos, no los valores reales - por lo que puede devolver resultados aparentemente extraños a veces.

1

Uso if(a.equals(b)) y no utilice == para comparar objetos que son subclases de la clase Object.

== operador es sólo para los tipos primitivos como int, long, etc.

Cuestiones relacionadas