2011-11-22 10 views
5

Avevo un frammento di codice:Integer classe di oggetti

public class Test{ 
    public static void main(String args[]){ 
     Integer a = 100; 
     Integer b = 100; 
     Integer c = 5000; 
     Integer d = 5000; 

     System.out.println(a); 
     System.out.println(b); 
     System.out.println(c); 
     System.out.println(d); 
     if(a == b) 
      System.out.println("a & b Both are Equal"); 
     else 
      System.out.println("a & b are Not Equal"); 
     if(c == d) 
      System.out.println("c & d Both are Equal"); 
     else 
      System.out.println("c & d are Not Equal"); 
    } 
} 

Non ricevo il motivo per cui l'uscita è così? il Output è:
a & b Both are equal
c & d are not equal
sto usando jdk1.7

+1

** Gli oggetti ** sono solo 'uguali' quando' equals() 'è vero. Usare '==' significa che i ** riferimenti ** sono gli stessi. –

risposta

7

Ciò è dovuto ad un'ottimizzazione nella macchina virtuale che mappa gli interi (di uso frequente) piccolo da un pool di oggetti che vengono riutilizzati. This answer spiega alcuni dettagli.

4

Sembra che il compilatore Java stia utilizzando i valori memorizzati nella cache per gli oggetti Integer. Questa cache è popolata solo per piccoli valori di inetger. Il valore di 100 è nella cache, quindi l'oggetto viene riutilizzato. Il valore di 5000 non è nel cahce e quindi ogni volta vengono creati nuovi oggetti.

Il == test di confronto per l'uguaglianza dell'oggetto, non l'uguaglianza di valore, quindi perché gli oggetti memorizzati nella cache sono considerati uguali e gli altri no.

+0

la tua affermazione può essere dimostrata? –

+0

Si prega di essere più preciso? Quale affermazione deve essere dimostrata? –

+0

Il tuo codice è la prova. –

2

si confrontano l'indirizzo degli Integer oggetti utilizzando l'operatore == e il compilatore deve essere semplicemente ri-utilizzato i a e b oggetti per la stessa variabile ma non i c e d oggetti. Se si prova uguaglianza utilizzando il metodo equals, allora si ottengono i risultati desiderati:

public class Test{ 
    public static void main(String args[]){ 
     Integer a = 100; 
     Integer b = 100; 
     Integer c = 5000; 
     Integer d = 5000; 

     System.out.println(a); 
     System.out.println(b); 
     System.out.println(c); 
     System.out.println(d); 
     if(a.equals(b)) 
      System.out.println("a & b Both are Equal"); 
     else 
      System.out.println("a & b are Not Equal"); 
     if(c.equals(d)) 
      System.out.println("c & d Both are Equal"); 
     else 
      System.out.println("c & d are Not Equal"); 
    } 
} 

100 
100 
5000 
5000 
a & b Both are Equal 
c & d Both are Equal 
0

inscatolamento conversione conversione inscatolamento converte i valori di tipo primitivo a valori di tipo di riferimento corrispondenti. In particolare, l'8 di conversione seguente sono chiamati le conversioni di pugilato:

Dal tipo booleano di tipo booleano Dal tipo di byte di tipo Byte Dal tipo char al tipo di carattere Dal tipo corto di tipo corto Dal tipo int al tipo integer Dal tipo lungo di tipo lungo Dal tipo float di tipo float Dal tipo double al tipo double in fase di esecuzione, i proventi di conversione boxe come segue:

Se p è un valore di tipo booleano, conversione poi boxe converte p in un riferimento r di classe e tipo Booleano, tale che r.bo oleanValue() == p Se p è un valore di tipo byte, la conversione di boxing converte p in un riferimento r di classe e digita Byte, tale che r.byteValue() == p Se p è un valore di tipo char , quindi la conversione di boxing converte p in un riferimento r di classe e digita Character, tale che r.charValue() == p Se p è un valore di tipo short, la conversione di boxing converte p in un riferimento r di classe e tipo Short , tale che r.shortValue() == p Se p è un valore di tipo int, la conversione di boxing converte p in un riferimento r di classe e digita Intero, tale che r.intValue() == p Se p è un valore di tipo long, quindi la conversione di boxing converte p in un riferimento r di classe e tipo Long, tale che r.longValue() == p Se p è un valore di tipo float quindi: Se p non è NaN, quindi convocazione di boxe ersion converte p in un riferimento r di classe e digita Float, tale che r.floatValue() restituisce p In caso contrario, la conversione di boxing converte p in un riferimento r di classe e digita Float tale che r.isNaN() restituisce true. Se p è un valore di tipo double, quindi Se p non è NaN, la conversione di boxing converte p in un riferimento r di classe e digita Double, tale che r.doubleValue() restituisce p Altrimenti, la conversione di boxing converte p in un riferimento r di classe e tipo Double tale che r.isNaN() restituisce true. Se p è un valore di un altro tipo, la conversione di boxing equivale a una conversione di identità (5.1.1). Se il valore p in box è vero, falso, un byte, un char nell'intervallo da \ u0000 a \ u007f, o un numero int o un numero breve compreso tra -128 e 127, quindi r1 e r2 devono essere i risultati di qualsiasi due boxe conversioni di p. È sempre il caso che r1 == r2 Buona lettura - http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.1.7