Warum ändert sich das Verhalten des Integer-Konstantenpools bei 127?
Ich bin nicht in der Lage zu verstehen, wie die Java-Konstanten-Pool für Integer arbeitet.
Verstehe ich das Verhalten von Strings ist und daher in der Lage mich zu rechtfertigen, dass es der gleiche Fall mit Integer-Konstanten auch.
So, für Ganzzahlen
Integer i1 = 127;
Integer i2 = 127;
System.out.println(i1==i2); //True
&
Integer i1 = new Integer(127);
Integer i2 = new Integer(127);
System.out.println(i1==i2); //False
Bis hier geht alles, in meinem Kopf.
Was ich bin nicht in der Lage zu verdauen ist, es verhält sich anders, wenn ich erhöhen ganze Zahl von 127. Dieses Verhalten ändert sich nach 127, unten ist das code-snippet
Integer i1 = 128;
Integer i2 = 128;
System.out.println(i1==i2); //False. WHY?????
Kann mir jemand helfen zu verstehen?
InformationsquelleAutor der Frage Vivek | 2012-10-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, Konstanten-pool für zahlen nicht die gleiche Weise funktionieren wie bei strings. Für Streicher, nur compile-time-Konstanten sind interniert - in der Erwägung, dass für die wrapper-Typen für integer-Typen, alle Boxen-Betrieb wird immer den pool, wenn es gilt für diesen Wert. So zum Beispiel:
Die Justiz, Freiheit und Sicherheit garantiert, eine kleine Auswahl von gepoolten Werte, aber Implementierungen können mit einer breiteren Palette, wenn Sie wollen.
Beachten, dass, obwohl es ist nicht garantiert, jede Umsetzung habe ich mir angeschaut, verwendet
Integer.valueOf
durchführen boxing-Operationen - so können Sie erhalten die gleiche Wirkung ohne die Sprache helfen:Vom Abschnitt 5.1.7 der JLS:
InformationsquelleAutor der Antwort Jon Skeet
Java verwaltet Ganzzahl-pool von
-128
zu127
Deklarieren Integer wie unten
Ergebnisse in
Also, was tatsächlich geschieht, für den ersten Fall ist
Aus dem source-code von
Integer
für KlassevalueOf
MethodeSo erhalten Sie die gleiche Referenz, wenn der Wert zwischen
-128
zu127
und rufen SievalueOf
es sonst noch so gibt einfach zurücknew Integer(i)
Und weil die Referenz ist gleiche Ihre
==
- operator funktioniert für ganze zahlen zurückgegebenvalueOf
zwischen diesem Bereich.InformationsquelleAutor der Antwort Amit Deshpande
Java-caches die integer-Objekte im Bereich
-128 to 127
. Also, wenn Sie versuchen, einen Wert zuweisen, in diesem Bereich zu einerwrapper
Objekt, dasboxing
operation aufrufenInteger.valueOf
Methode und wiederum weist einen Verweis auf das Objekt, das sich bereits in den pool.Auf der anderen Seite, wenn Sie einen Wert zuzuweisen, der außerhalb dieses Bereichs auf ein
wrapper
Referenz-Typ,Integer.valueOf
wird eine neueInteger
Objekt für diesen Wert. Und damit, Vergleich derreference
fürInteger
Objekte mit Wert außerhalb dieses Bereichs wird Ihnenfalse
So,
Aber , wenn Sie Ihre integer-Instanzen mit
new
- operator wird ein neues Objekt erzeugt, auf Heap.So,
InformationsquelleAutor der Antwort Rohit Jain
Kurz neueren Versionen der Java-cache Integer im Bereich von -128 bis 127 (256 Werte).
schauen Sie hier
Was genau macht der Vergleich der zahlen mit == machen?
InformationsquelleAutor der Antwort SRJ