2012-02-17 6 views
8

Eventuali duplicati:
Inconsistent behavior on java's ==
Integer wrapper objects share the same instances only within the value 127?java == per intero

ho trovato il seguente comportamento == per gli oggetti interi e non riesco a capire esso. (Sono ben consapevole che si dovrebbe utilizzare è uguale per tali confronti, ma sto studiando per OCPJP ...)

In breve, == funziona come previsto per il 1000, ma non per 10.

L'ex frammento di codice è:

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

e si comporta come ci si aspetterebbe:

different objects 
meaningfully equal 

quest'ultimo però:

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

ha il seguente output:

same object 
meaningfully equal 

Qualcuno può spiegare perché questo sta accadendo?

+1

BTW Provate con '-XX: + AggressiveOpts' e il primo si comporterà come la seconda, come aumenta la dimensione della cache Integer. ;) –

risposta

11

Da Java 5 è stata introdotta la memorizzazione nella cache della classe wrapper. Quello che segue è un esame della cache creata da una classe interna, IntegerCache, che si trova nella cache Integer. Ad esempio, il seguente codice crea una cache:

Integer myNumber = 10 

o

Integer myNumber = Integer.valueOf(10); 

256 oggetti interi sono creati nell'intervallo da -128 a 127 che sono tutti memorizzati in una matrice intera. Questa funzionalità di memorizzazione nella cache può essere vista esaminando la classe interna, IntegerCache, che si trova in Numero intero:

Quindi, quando si crea un oggetto utilizzando Integer.valueOf o direttamente assegnando un valore a un numero intero compreso tra -128 e 127 lo stesso oggetto sarà restituito. Pertanto, si consideri il seguente esempio:

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."); 

Il risultato è:

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

È importante notare che oggetto i e p equiparare solo vero perché sono lo stesso oggetto, il confronto non è in base al valore, si basa sull'uguaglianza degli oggetti. Se In iger i e p sono fuori da -128 o 127, la cache non viene utilizzata, quindi vengono creati nuovi oggetti. Quando si esegue un confronto per il valore, utilizzare sempre il metodo ".equals". È anche importante notare che l'istanziazione di un intero non crea questa memorizzazione nella cache.

Ricorda che “==” viene sempre utilizzato per l'uguaglianza oggetto ma non e 'stato sovraccaricato per il confronto di valori unboxed