2010-10-27 15 views
6

ho fissato un ciclo infinito, cambiando Integer per int nella seguente:Confrontando Integer oggetti vs int

public class IntTest { 
    public static void main(String[] args) { 
     Integer x=-1; 
     Integer total=1000; 

     while(x != total){ 
      System.out.println("x =" + x + "total ="+ total); 
      x++; 
     } 
    } 
} 

Qual è la ragione adeguata per questo? Ho pensato che Integer avrebbe paragonato nessun problema.

Grazie.

+0

Potrebbe anche essere stato modificato "x! = Totale" su "totale! = X". – DJClayworth

+0

Acquista http://www.javapractices.com/topic/TopicAction.do?Id=197 –

risposta

17

Perché quando fai! = Confrontando sull'oggetto confronta i riferimenti. E i riferimenti tra due oggetti nel caso generale sono diversi.

Quando si confrontano le primitive, si confrontano sempre le primitive, diciamo non i riferimenti (non ci sono oggetti), ma i valori.

Quindi, se si desidera lavorare con Intero, è necessario utilizzare equals() su di essi.

Inoltre, se i valori sono compresi tra 0 e 255, il confronto tra Intero funziona correttamente, a causa della memorizzazione nella cache.

potete leggere qui: http://download.oracle.com/javase/tutorial/java/data/numberclasses.html

+4

D'altra parte, se hai usato! = Tra un intero e un intero, l'annullamento automatico di un box ti darebbe il risultato che ti aspetti. – Powerlord

+0

Che ne dici di confrontare una primitiva e un oggetto, come int e Integer? È possibile in Java – Bionix1441

2

Il problema è che Integer è una classe e quindi anche il confronto viene eseguito come per qualsiasi altra classe, utilizzando il metodo .equals(). Se lo si confronta con ==, si confrontano i riferimenti che sono sempre diversi per due istanze distinte. Il tipo primitivo int non è una classe ma un tipo integrato Java e il confronto viene quindi gestito appositamente dal compilatore e funziona come previsto.

1

Integer è un wrapper di classe intorno al tipo primitivo int Java. Non sono la stessa cosa. si dovrebbe utilizzare int invece di Integer se non avete un motivo valido (come ad esempio ArrayList<Integer> list;

5

Integer è un Object, e gli oggetti sono confrontati con .equals(..)

Solo primitive sono confrontati con ==

Questo è il regola, a parte alcuni casi eccezionali, dove ==può essere utilizzato per il confronto di oggetti. Ma anche in questo caso non è consigliabile

2

È possibile utilizzare Int eger.intValue() per ottenere il valore int per il confronto, se è veramente necessario utilizzare Intero a tutti.