Heim >Java >javaLernprogramm >Warum liefert Javas Integer-Boxing unterschiedliche Ergebnisse für „Integer == Integer'-Vergleiche?

Warum liefert Javas Integer-Boxing unterschiedliche Ergebnisse für „Integer == Integer'-Vergleiche?

Susan Sarandon
Susan SarandonOriginal
2024-12-24 08:39:14716Durchsuche

Why Does Java's Integer Boxing Produce Different Results for `Integer == Integer` Comparisons?

Seltsames Java-Integer-Boxing

Der Integer-Boxing-Mechanismus von Java kann Sie leicht verwirren, insbesondere beim Vergleich der Referenzgleichheit.

Problem

Bedenken Sie den folgenden Codeausschnitt:

public class Scratch {
    public static void main(String[] args) {
        Integer a = 1000, b = 1000;
        System.out.println(a == b); // false

        Integer c = 100, d = 100;
        System.out.println(c == d); // true
    }
}

Beim Ausführen wird Folgendes generiert:

false
true

Erste Zeile Das Ergebnis wird erwartet, da a und b unterschiedliche Objekte sind. Aber was ist das Ergebnis der zweiten Zeile?

Antwort

Das wahre Ergebnis der zweiten Zeile wird durch die Sprachspezifikation garantiert. Gemäß Abschnitt 5.1.7:

Wenn der zu boxende Wert p true, false, byte oder char im Bereich u0000 bis u007f oder int oder short zwischen -128 und 127 ist, dann Die Ergebnisse von any zwei Boxing-Transformationen auf p, r1 und r2, sind immer gleich.

Während die zweite Ausgabezeile garantiert ist, ist dies für die erste Zeile nicht garantiert (siehe den letzten unten zitierten Absatz):

Idealerweise generiert p Boxing bei einem gegebenen primitiven Wert immer dasselbe Referenz. In der Praxis ist dies mit den vorhandenen Implementierungstechniken möglicherweise nicht möglich. Die obige Regel ist ein pragmatischer Kompromiss. Die letzte Klausel oben verlangt, dass bestimmte gemeinsame Werte immer in nicht unterscheidbare Objekte eingepackt werden. Implementierungen können es entweder träge oder sofort zwischenspeichern.

Für andere Werte erlaubt diese Darstellung dem Programmierer keine Annahmen über die Identität des eingerahmten Werts. Dies ermöglicht (aber erzwingt nicht) die gemeinsame Nutzung einiger oder aller dieser Referenzen.

Dadurch wird sichergestellt, dass das Verhalten in den meisten Fällen das gewünschte Verhalten ohne unnötigen Leistungsverlust ist, insbesondere auf kleinen Geräten. Implementierungen mit weniger Speichereinschränkungen können alle Zeichen und Kurzzeichen sowie Ganzzahlen und Langzahlen im Bereich von -32 KB bis 32 KB zwischenspeichern.

Das obige ist der detaillierte Inhalt vonWarum liefert Javas Integer-Boxing unterschiedliche Ergebnisse für „Integer == Integer'-Vergleiche?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn