Bir tamsayı referansına bir int değişmezinin doğrudan atanması, nesne dönüştürme kodunun değişmez değerinin derleyici tarafından işlendiği bir otomatik kutulama örneğidir.
Derleme aşaması derleyici dönüştürür sırasında Yani Integer a = 1000, b = 1000;
için Integer a = Integer.valueOf(1000), b = Integer.valueOf(1000);
.
Dolayısıyla Integer.valueOf()
bize tamsayı nesnelerini veren Integer.valueOf()
yöntemdir ve yöntemin kaynak koduna bakarsak, yöntemin -128 ila 127 (dahil) aralığında tam sayı nesneleri önbelleğe aldığını açıkça görebiliriz.
/**
*
* 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);
}
Dolayısıyla, yeni tamsayı nesneleri oluşturmak ve döndürmek yerine , iletilen int değişmez değeri -128'den büyük ve 127'den küçükse Integer.valueOf()
, yöntem dahili nesneden Tamsayı nesneleri döndürür IntegerCache
.
Java, bu tamsayı nesnelerini önbelleğe alır çünkü bu tamsayı aralığı, günlük programlama için çok kullanılır ve bu da dolaylı olarak biraz bellek tasarrufu sağlar.
Önbellek, statik blok nedeniyle sınıf belleğe yüklendiğinde ilk kullanımda başlatılır. Maksimum önbellek aralığı -XX:AutoBoxCacheMax
JVM seçeneği ile kontrol edilebilir .
Tamsayı biz de var Integer.IntegerCache benzer sadece nesneleri için bu önbelleğe alma davranışı geçerli değildir ByteCache, ShortCache, LongCache, CharacterCache
için Byte, Short, Long, Character
sırasıyla.
Java Integer Cache - Why Integer.valueOf (127) == Integer.valueOf (127) Is True makalem hakkında daha fazla bilgi edinebilirsiniz .