Die Seltsamkeiten des Integer-Boxings in Java verstehen
In Java haben primitive Datentypen wie Ganzzahlen entsprechende Wrapper-Klassen, wie z. B. Integer bieten objektorientierte Funktionalität. Wie diese Werte verpackt und entpackt werden, kann zu überraschenden Ergebnissen führen.
Eine solche Beobachtung ergibt sich aus dem folgenden Code:
public class WeirdBoxing { public static void main(String[] args) { Integer a = 1000, b = 1000; System.out.println(a == b); Integer c = 100, d = 100; System.out.println(c == d); } }
Bei der Ausführung gibt dieser Code Folgendes aus:
false true
Warum gibt der erste Vergleich „falsch“ zurück, während der zweite „wahr“ zurückgibt? Gemäß dem ==-Operator sollten Referenzen immer verglichen werden.
Das Geheimnis hinter dem „wahren“ Vergleich
Interessanterweise ist der wahre Vergleich kein Zufall. Abschnitt 5.1.7 der Java Language Specification (JLS) besagt:
Wenn der Wert p, der eingerahmt wird, [...] ein int oder eine kurze Zahl zwischen -128 und 127 ist, [...] dann seien r1 und r2 seien die Ergebnisse von zwei beliebigen Boxkonvertierungen von p. Es ist immer so, dass r1 == r2.
In diesem Fall enthalten c und d beide Werte innerhalb des angegebenen Bereichs, was dazu führt, dass ihre Boxdarstellungen (Integer-Objekte) identisch sind.
Die Mehrdeutigkeit von Vergleichen ohne festen Bereich
Im Gegensatz dazu ist der erste Vergleich (a == b) fällt nicht unter die Regel der garantierten Gleichheit. Das JLS betont Folgendes:
Für andere Werte lassen [die Regeln] keine Annahmen über die Identität der eingerahmten Werte seitens des Programmierers zu.
Im Wesentlichen gilt, wenn Werte außerhalb des festen Bereichs eingerahmt werden, Es gibt keine Garantie für die Gleichheit Referenzen.
Fazit
Das seltsame Verhalten des Integer-Boxings in Java ist darauf zurückzuführen, dass die Sprachspezifikation Effizienz und gemeinsame Anwendungsfälle vorsieht. Während Werte innerhalb eines bestimmten Bereichs garantiert identisch eingerahmt sind, ist die Identität der eingerahmten Objekte bei anderen Werten unvorhersehbar. Dieses Verständnis verdeutlicht die „Verrücktheit“, die durch den eingangs vorgestellten Codeausschnitt veranschaulicht wird.
Das obige ist der detaillierte Inhalt vonWarum gibt Integer Boxing in Java bei „=='-Vergleichen manchmal „true' und manchmal „false' zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!