Betrachten Sie diesen Code:
%Vor%Es druckt:
%Vor% Ich verstehe die erste false
, der == Operator überprüft nur, ob zwei Referenzen am selben Objekt arbeiten, was in diesem Fall nicht der Fall ist.
Die folgenden true
und false
haben mich am Kopf kratzen. Warum würde Java i3
und i4
gleich betrachten, aber i1
und i2
anders? Beide wurden in Integer verpackt, sollte nicht beide als falsch bewertet werden? Gibt es einen praktischen Grund für diese Inkonsistenz?
Das Autoboxing von Primitiven in Objekten (wie es in Ihren Aufrufen von method
verwendet wird, verwendet einen Cache mit kleinen Werten. Aus dem Java-Sprachspezifikation Abschnitt 5.1.7 :
Wenn der Wert p, der eingerahmt wird, wahr ist, Falsch, ein Byte, ein Zeichen im Bereich \ u0000 \ n007f, oder ein int oder kurz Nummer zwischen -128 und 127, dann lassen r1 und r2 sind die Ergebnisse von zweien Boxenkonvertierungen von p. Es ist immer der Fall, dass r1 == r2.
Der Diskussionsteil der darauf folgenden Spezifikation ist ebenfalls interessant. Bemerkenswerterweise kann eine JVM mehr -Werte zwischenspeichern, wenn sie das will - Sie können nicht sicher sein, was Sie tun können:
%Vor%Beim Autoboxing werden Ganzzahlen zwischen -128 und 127 zwischengespeichert, und das gleiche Wrapper-Objekt wird zurückgegeben. Das Gleiche gilt für boolesche Werte und Zeichenwerte zwischen \ u0000 und \ u007F
Das ist die meiste Zeit, aber es hängt von der JVM-Implementierung ab.
Autoboxing verwendet Integer.valueOf (i) , nicht New Integer (i), um ein Objekt der Klasse Integer zu konstruieren.
Wie die anderen bereits gesagt haben, verwendet valueOf () einen Cache, hauptsächlich für die Speicherplatzeffizienz.
Verwenden Sie nicht == auf Referenztypen, es ist fast immer ein Fehler.
Integer-Klasse enthält einen Cache einiger häufig verwendeter Instanzen. Der Bereich der Werte variiert im Allgemeinen von JVM zu JVM (manchmal ist auch konfigurierbar), aber im Allgemeinen ist der relevante Code etwas wie:
%Vor%(Code von Sonne JDK 1.6)
Dies ist wie beim String-Interning, da es sowohl Speicher spart als auch die Testgleichheit mithilfe einer Referenz ermöglicht (z. B. == anstelle von gleich )
Autoboxing verwendet einige Caching-Mechanismen. Normalerweise sollten Sie sich niemals auf ==
verlassen, verwenden Sie immer equals
, um die Gleichheit zu prüfen.