Wenn Sie ein Zahlenliteral in Java kompilieren und es einer Ganzzahl (Großbuchstabe I
) zuweisen, gibt der Compiler Folgendes aus:
Integer b2 =Integer.valueOf(127)
Diese Codezeile wird auch generiert, wenn Sie Autoboxing verwenden.
valueOf
wird so implementiert, dass bestimmte Zahlen "gepoolt" werden, und es wird dieselbe Instanz für Werte kleiner als 128 zurückgegeben.
Aus dem Java 1.6-Quellcode, Zeile 621:
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
Der Wert von high
kann mit der Systemeigenschaft auf einen anderen Wert konfiguriert werden.
-Djava.lang.Integer.IntegerCache.high = 999
Wenn Sie Ihr Programm mit dieser Systemeigenschaft ausführen, wird true ausgegeben!
Die offensichtliche Schlussfolgerung: Verlassen Sie sich niemals darauf, dass zwei Referenzen identisch sind, sondern vergleichen Sie sie immer mit der .equals()
Methode.
Also b2.equals(b3)
wird true für alle logisch gleichen Werte von b2, b3 gedruckt.
Beachten Sie, dass der Integer
Cache aus Leistungsgründen nicht vorhanden ist, sondern der JLS entspricht, Abschnitt 5.1.7 ; Die Objektidentität muss für die Werte -128 bis einschließlich 127 angegeben werden.
Die Ganzzahl # valueOf (int) dokumentiert auch dieses Verhalten:
Diese Methode führt wahrscheinlich zu einer deutlich besseren räumlichen und zeitlichen Leistung, indem häufig angeforderte Werte zwischengespeichert werden. Diese Methode speichert immer Werte im Bereich von -128 bis einschließlich 127 zwischen und kann andere Werte außerhalb dieses Bereichs zwischenspeichern.