2012-02-17 15 views
8

Duplicar posible:
Inconsistent behavior on java's ==
Integer wrapper objects share the same instances only within the value 127?java para == Entero

He encontrado el siguiente comportamiento == para objetos enteros y no llego a entenderlo. (Soy muy consciente de que se debe usar es igual para tales comparaciones, pero estoy estudiando para OCPJP ...)

En resumen, == funciona como se espera para el 1000, pero no para 10.

El primero fragmento de código es:

Integer i1 = 1000; 
Integer i2 = 1000; 
if(i1 != i2) System.out.println("different objects"); 
if(i1.equals(i2)) System.out.println("meaningfully equal"); 

y se comporta como cabría esperar:

different objects 
meaningfully equal 

Este último sin embargo:

Integer i3 = 10; 
Integer i4 = 10; 
if(i3 == i4) System.out.println("same object"); 
if(i3.equals(i4)) System.out.println("meaningfully equal"); 

tiene el siguiente resultado:

same object 
meaningfully equal 

Por favor alguien puede explicar por qué ocurre esto?

+1

Por cierto Pruebe con '-XX: + AggressiveOpts' y el primero que se comportará como el segundo, como aumenta el tamaño de la memoria caché Integer. ;) –

Respuesta

11

Desde Java 5, se introdujo el almacenamiento en caché de la clase contenedora. A continuación, se muestra un examen de la memoria caché creada por una clase interna, IntegerCache, que se encuentra en la memoria caché Integer. Por ejemplo, el siguiente código creará una memoria caché:

Integer myNumber = 10 

o

Integer myNumber = Integer.valueOf(10); 

256 objetos Integer se crean en el rango de -128 a 127 que se almacenan en una matriz de enteros. Esta funcionalidad de caché puede verse mirando la clase interna, IntegerCache, que se encuentra en Integer:

Al crear un objeto usando Integer.valueOf o asignando directamente un valor a un entero dentro del rango de -128 a 127 el mismo objeto será devuelto. Por lo tanto, considere el siguiente ejemplo:

Integer i = 100; 
Integer p = 100; 
if (i == p) 
    System.out.println("i and p are the same."); 
if (i != p) 
    System.out.println("i and p are different."); 
if(i.equals(p)) 
    System.out.println("i and p contain the same value."); 

La salida es:

i and p are the same. 
i and p contain the same value. 

Es importante señalar que objeto i y p sólo equivale a la verdad porque son el mismo objeto, la comparación no es basado en el valor, se basa en la igualdad de objetos. Si Integer i y p están fuera del rango de -128 o 127, la caché no se usa, por lo tanto, se crean nuevos objetos. Al hacer una comparación para el valor siempre use el método ".equals". También es importante tener en cuenta que crear instancias de un Entero no crea este almacenamiento en caché.

Recuerde que “==” se usa siempre para igualdad de objetos, no ha sido sobrecargado para comparar valores unboxed

Cuestiones relacionadas