Die direkte Zuweisung eines int-Literals zu einer Integer-Referenz ist ein Beispiel für das automatische Boxen, bei dem der Literalwert zum Objektkonvertierungscode vom Compiler verarbeitet wird.
Während der Kompilierungsphase konvertiert der Compiler Integer a = 1000, b = 1000;
in Integer a = Integer.valueOf(1000), b = Integer.valueOf(1000);
.
Es ist also die Integer.valueOf()
Methode, die uns tatsächlich die Ganzzahlobjekte gibt, und wenn wir uns den Quellcode der Integer.valueOf()
Methode ansehen, können wir deutlich sehen, dass die Methode Ganzzahlobjekte im Bereich von -128 bis 127 (einschließlich) zwischenspeichert.
/**
*
* This method will always cache values in the range -128 to 127,
* inclusive, and may cache other values outside of this range.
*
* @param i an {@code int} value.
* @return an {@code Integer} instance representing {@code i}.
* @since 1.5
*/
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
Anstatt neue ganzzahlige Objekte zu erstellen und zurückzugeben, gibt Integer.valueOf()
die Methode ganzzahlige Objekte aus dem internen zurück, IntegerCache
wenn das übergebene int-Literal größer als -128 und kleiner als 127 ist.
Java speichert diese Ganzzahlobjekte zwischen, da dieser Bereich von Ganzzahlen in der täglichen Programmierung häufig verwendet wird, wodurch indirekt etwas Speicherplatz gespart wird.
Der Cache wird bei der ersten Verwendung initialisiert, wenn die Klasse aufgrund des statischen Blocks in den Speicher geladen wird. Der maximale Bereich des Caches kann über die -XX:AutoBoxCacheMax
JVM-Option gesteuert werden .
Dieses Caching - Verhalten ist nicht anwendbar für Integer nur Objekte, ähnlich wie Integer.IntegerCache haben wir auch ByteCache, ShortCache, LongCache, CharacterCache
für Byte, Short, Long, Character
jeweils.
Sie können mehr über meinen Artikel Java Integer Cache lesen - Warum Integer.valueOf (127) == Integer.valueOf (127) wahr ist .