class D {
public static void main(String args[]) {
Integer b2=128;
Integer b3=128;
System.out.println(b2==b3);
}
}
Ausgabe:
false
class D {
public static void main(String args[]) {
Integer b2=127;
Integer b3=127;
System.out.println(b2==b3);
}
}
Ausgabe:
true
Hinweis: Zahlen zwischen -128 und 127 sind wahr.
Antworten:
Wenn Sie ein Zahlenliteral in Java kompilieren und es einer Ganzzahl (Großbuchstabe
I
) zuweisen, gibt der Compiler Folgendes aus: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:
Der Wert von
high
kann mit der Systemeigenschaft auf einen anderen Wert konfiguriert werden.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:
quelle
false
. Tatsächlich kann dies bereits heute als Nebeneffekt der Anwendung von Escape Analysis und Scalar Replacement auftreten.Autoboxing-Caches -128 bis 127. Dies ist im JLS ( 5.1.7 ) angegeben.
Eine einfache Regel, die Sie beim Umgang mit Objekten beachten sollten, lautet: Verwenden
.equals
Sie diese Option, wenn Sie überprüfen möchten, ob die beiden Objekte "gleich" sind. Verwenden==
Sie diese Option, wenn Sie feststellen möchten, ob sie auf dieselbe Instanz verweisen.quelle
Die Verwendung primitiver Datentypen, Ints, würde in beiden Fällen die erwartete Ausgabe erzeugen.
Da Sie jedoch Integer-Objekte verwenden, hat der Operator == eine andere Bedeutung.
== prüft im Kontext von Objekten, ob sich die Variablen auf dieselbe Objektreferenz beziehen.
Um den Wert der Objekte zu vergleichen, sollten Sie die Methode equals () verwenden, z
Dies zeigt an, ob b2 kleiner als b1, größer als oder gleich ist (überprüfen Sie die API auf Details).
quelle
Es ist Speicheroptimierung in Java bezogen.
quelle
Werfen Sie einen Blick auf die Integer.java, wenn der Wert zwischen -128 und 127 ist, wird die im Cache - Pool verwenden, so
(Integer) 1 == (Integer) 1
während(Integer) 222 != (Integer) 222
quelle
Andere Antworten beschreiben, warum die beobachteten Effekte beobachtet werden können, aber das ist für Programmierer wirklich nebensächlich (interessant, aber etwas, das Sie beim Schreiben von tatsächlichem Code vergessen sollten).
Verwenden Sie die
equals
Methode, um Integer-Objekte auf Gleichheit zu vergleichen .Versuchen Sie nicht, Integer-Objekte mit dem Identitätsoperator auf Gleichheit zu vergleichen
==
.Es kann vorkommen, dass einige gleiche Werte identische Objekte sind, aber darauf sollte man sich im Allgemeinen nicht verlassen.
quelle
Ich habe Folgendes geschrieben, da dieses Problem nicht nur für Integer spezifisch ist. Mein Fazit ist, dass Sie häufig falsches Verhalten feststellen, wenn Sie die API falsch verwenden. Verwenden Sie es richtig und Sie sollten das richtige Verhalten sehen:
quelle