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 IntegerCache
jika 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:AutoBoxCacheMax
opsi JVM.
Perilaku caching ini tidak berlaku untuk objek Integer saja, mirip dengan Integer.IntegerCache yang juga kami miliki ByteCache, ShortCache, LongCache, CharacterCache
untuk Byte, Short, Long, Character
masing - masing.
Anda dapat membaca lebih lanjut di artikel saya Java Integer Cache - Why Integer.valueOf (127) == Integer.valueOf (127) Is True .