2010-06-21 6 views
16

Die Ausgabe des aktuellen Programms ist "Strange". Aber beide Variablen teilen sich die gleiche Referenz. Warum sind die zweiten und dritten Vergleiche nicht wahr?Vergleich zwischen Variablen, die auf dasselbe Integer-Objekt zeigen

Integer a; 
Integer b; 
a = new Integer(2); 
b = a; 
if(b == a) { 
    System.out.println("Strange"); 
} 
a++; 
if(b == a) { 
    System.out.println("Stranger"); 
} 
a--; 
if(b == a) { 
    System.out.println("Strangest"); 
} 

Ausgang: Strange

+0

Unboxing ist wahrscheinlich die Antwort. Ich habe jedoch keine wirkliche Idee. – jjnguy

+9

+1 für die Demonstration einer unverzeihlichen Verwendung von Autoboxing. –

Antwort

19

Das ist das Artefakt von Autoboxing und eine Tatsache, dass Integer in Java unveränderlich ist.

Die a++ und a-- sind in etwa das übersetzt.

int intA = a.getInt(); 
intA++; 
a = Integer.valueOf(intA); // this is a reference different from b 
+14

Beachten Sie, dass, wenn Sie 'a = new Integer (2)' durch 'a = Integer.valueOf (2)' ersetzen, "Strangest" auch gedruckt wird, da es den Integer-Cache zum Abrufen der Instanz verwendet. –

+0

Was meinen Sie mit Integer-Cache in Ihrem Kommentar? Kannst du es ausarbeiten? – restrictedinfinity

+4

@restrictedinfinity. Zumindest in Sun's Java haben Byte, Short und Integer einen Cache von 256 Werten von -128 bis einschließlich 127, die von der 'Type.valueOf()' Methode bedient werden. In unserem Fall nach 'a - 'ist der int-Wert' 2 'und das wäre das gleiche, mit dem wir begonnen haben, also hätte' Integer.valueOf (2) 'das gleiche' Integer'-Objekt zurückgegeben. Beachten Sie, dass der 'Long'-Typ keinen Cache hat, daher gibt' Long.valueOf' immer ein neues Objekt zurück. –

6
  • Strage - es offensichtlich ist, weisen die beiden Variablen auf das gleiche Objekt

  • nicht Stranger wegen Autoboxing. Integer ist unveränderlich, so dass jede Operation darauf eine neue Instanz erstellt.

  • nicht Strangest, wegen des vorherigen Punkts, und weil Sie new Integer(..) verwendet haben, die den Cache ignoriert, der für den Bytebereich verwendet wird. Wenn Sie anfangs Integer.valueOf(2) verwenden, wird die zwischengespeicherte Integer s verwendet und Strangest wird ebenfalls gedruckt.

Verwandte Themen