In Bezug auf meine vorherige Frage, warum ergeben == Vergleiche mit Integer.valueOf (String) unterschiedliche Ergebnisse für 127 und 128? Wir wissen, dass Integer
class
es einen Cache gibt, in dem Werte zwischen -128
und gespeichert werden 127
.
Ich frage mich nur, warum zwischen -128 und 127 ?
In der Dokumentation zu Integer.valueOf () wurde angegeben, dass " häufig angeforderte Werte zwischengespeichert werden " . Aber werden Werte zwischen -128
und 127
häufig für real angefordert? Ich fand häufig angeforderte Werte sehr subjektiv.
Gibt es einen möglichen Grund dafür?
In der Dokumentation heißt es außerdem: " ..und kann andere Werte außerhalb dieses Bereichs zwischenspeichern. "
Wie kann dies erreicht werden?
Antworten:
Ich frage mich nur, warum zwischen -128 und 127?
Ein größerer Bereich von Ganzzahlen kann zwischengespeichert werden, aber mindestens diejenigen zwischen -128 und 127 müssen zwischengespeichert werden, da dies in der Java-Sprachspezifikation (Schwerpunkt Mine) vorgeschrieben ist:
Die Gründe für diese Anforderung werden im selben Absatz erläutert:
Wie kann ich andere Werte außerhalb dieses Bereichs zwischenspeichern?
Sie können die
-XX:AutoBoxCacheMax
JVM-Option verwenden, die in der Liste der verfügbaren Hotspot-JVM-Optionen nicht wirklich dokumentiert ist . Es wird jedoch in den Kommentaren innerhalb derInteger
Klasse um Zeile 590 erwähnt :Beachten Sie, dass dies implementierungsspezifisch ist und möglicherweise auf anderen JVMs verfügbar ist oder nicht.
quelle
-128 bis 127 ist die Standardgröße. Aber javadoc sagt auch , dass die Größe der Integer - Cache kann durch die gesteuerte
-XX:AutoBoxCacheMax=<size>
Option. Beachten Sie, dass nur ein hoher Wert festgelegt wird. Der niedrige Wert ist immer -128. Diese Funktion wurde in 1.6 eingeführt.Warum -128 bis 127 - dies ist ein Byte-Wertebereich und es ist natürlich, ihn für einen sehr kleinen Cache zu verwenden.
quelle
-XX:AutoBoxCacheMax=<size>
?java -XX:AutoBoxCacheMax=256
in der Konsole bekam ichError:could not create the Java Virtual Machine
Der Grund für das Zwischenspeichern kleiner Ganzzahlen ist, dass viele Algorithmen kleine Ganzzahlen in ihren Berechnungen verwenden. Daher lohnt es sich, den Aufwand für die Objekterstellung für diese Werte zu vermeiden.
Die Frage wird dann, welche Ganzzahlen zwischengespeichert werden sollen. Im Allgemeinen nimmt die Häufigkeit, mit der konstante Werte verwendet werden, tendenziell ab, wenn der absolute Wert der Konstanten zunimmt - jeder verbringt viel Zeit mit den Werten 1 oder 2 oder 10, relativ wenige verwenden den Wert 109 sehr intensiv; Bei weniger Leistung hängt es davon ab, wie schnell eine Ganzzahl für 722 erhalten werden kann. Java hat 256 Slots zugewiesen, die sich über den Bereich eines vorzeichenbehafteten Bytewerts erstrecken. Diese Entscheidung wurde möglicherweise durch die Analyse der zu diesem Zeitpunkt existierenden Programme getroffen, ist aber ebenso wahrscheinlich eine rein willkürliche. Es ist eine angemessene Menge an Platz zum Investieren, es kann schnell zugegriffen werden (Maske, um herauszufinden, ob der Wert im Bereich des Caches liegt, dann eine schnelle Tabellensuche, um auf den Cache zuzugreifen), und es wird definitiv die häufigsten Fälle abdecken.
Mit anderen Worten, ich denke, die Antwort auf Ihre Frage lautet: "Es ist nicht so subjektiv wie Sie dachten, aber die genauen Grenzen sind größtenteils eine Faustregelentscheidung ... und experimentelle Beweise waren, dass es gut genug war. ""
quelle
Der maximal hohe Ganzzahlwert, der zwischengespeichert werden kann, kann über die Systemeigenschaft ie
java.lang.Integer.IntegerCache.high
(-XX:AutoBoxCacheMax
) konfiguriert werden . Der Cache wird mithilfe eines Arrays implementiert.quelle
Wenn Sie auf eine Integer-Klasse stoßen und immer im Bereich von -128 bis 127 boxen, ist es immer besser, das Integer-Objekt wie folgt in den int-Wert zu konvertieren.
quelle