Ich weiß, dass es eine sehr grundlegende Frage ist, aber ich möchte über das Konzept klar sein. Ich möchte wissen, wie ==
Operator im Falle von primitiven und Objekttyp funktioniert. Zum Beispiel
Wie a
mit b
verglichen wird, während a
die Referenz des Objekts enthält, das den Wert 1 enthält. Kann mir jemand klar machen, wie es intern funktioniert?
Im Allgemeinen führt der Gleichheitsoperator in Java einen sogenannten flachen Vergleich durch. Mit anderen Worten vergleicht es die Werte, die Variablen enthalten. Jetzt enthalten die Variablen primitiver Datentypen den Wert selbst, während die Referenztypen einen Verweis auf den Heap-Bereich enthalten, der den eigentlichen Inhalt speichert. Das bedeutet, dass in Ihrem Code-Snippet int b
den Wert 1
und Integer a
die Speicheradresse des tatsächlichen Integer-Objekts auf dem Heap enthält.
Nun gibt es in dem von Ihnen angegebenen Beispiel eine Besonderheit. Integer-Klasse Eine spezielle Wrapper-Klasse, die primitive Integer-Typen umschließt. Der Compiler kann automatisch zwischen solchen Wrapper-Objekten und primitiven Typen konvertieren (was Boxen und Unboxing genannt wird).
Lassen Sie uns Schritt für Schritt durch den Code gehen, um es klarzustellen.
%Vor%Der Compiler ersetzt in dieser Zeile den folgenden Code:
%Vor% Die statische Methode valueOf
gibt eine Wrapper-Objektinstanz zurück, die den bereitgestellten primitiven Wert umschließt. Diese Prozedur, wenn der Compiler eine Wrapper-Klasse aus einem primitiven Typ erstellt, wird Boxing genannt.
Wenn ein solches Wrapper-Objekt verwendet wird, wird es mit einer primitiven Variablen verglichen, die den Gleichheitsoperator
verwendet %Vor%Der Compiler ändert es tatsächlich zu dem folgenden:
%Vor% wobei intValue
den Grundelementwert zurückgibt, der durch das Wrapper-Objekt umhüllt ist (was Unboxing genannt wird), d. h. es entpackt den Grundelementwert und macht den Ausdruck äquivalent zum Vergleichen zweier Grundelemente. Deshalb gab der Gleichheitsoperator dann true
In Ihrem speziellen Beispiel wird der Boxed-Typ Integer zu einem primitiven Typ int dekomprimiert, und ==
vergleicht Primitive (d. h. wahr in Ihrem Fall).