Penetapan langsung literal int ke referensi Integer adalah contoh auto-boxing, di mana nilai literal ke kode konversi objek ditangani oleh kompilator.
Jadi selama fase kompilasi, kompilator diubah Integer a = 1000, b = 1000;menjadi Integer a = Integer.valueOf(1000), b = Integer.valueOf(1000);.
Jadi ini adalah Integer.valueOf()metode yang benar-benar memberi kita objek integer, dan jika kita melihat kode sumber Integer.valueOf()metode kita dapat dengan jelas melihat metode cache objek integer dalam kisaran -128 hingga 127 (inklusif).
/**
*
* 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);
}
Jadi, alih-alih membuat dan mengembalikan objek integer baru, Integer.valueOf()metode ini mengembalikan objek Integer dari internal IntegerCachejika literal int yang diteruskan lebih besar dari -128 dan kurang dari 127.
Java menyimpan cache objek integer ini karena kisaran integer ini banyak digunakan dalam pemrograman sehari-hari yang secara tidak langsung menghemat beberapa memori.
Cache diinisialisasi pada penggunaan pertama saat kelas dimuat ke memori karena blok statis. Kisaran maksimal cache dapat dikontrol dengan -XX:AutoBoxCacheMaxopsi JVM.
Perilaku caching ini tidak berlaku untuk objek Integer saja, mirip dengan Integer.IntegerCache yang juga kami miliki ByteCache, ShortCache, LongCache, CharacterCacheuntuk Byte, Short, Long, Charactermasing - masing.
Anda dapat membaca lebih lanjut di artikel saya Java Integer Cache - Why Integer.valueOf (127) == Integer.valueOf (127) Is True .