การกำหนด int ลิเทอรัลให้กับการอ้างอิงจำนวนเต็มเป็นตัวอย่างของการชกมวยอัตโนมัติที่คอมไพลเลอร์จัดการค่าตามตัวอักษรไปยังรหัสการแปลงอ็อบเจ็กต์
ดังนั้นในระหว่างการคอมไพเลอร์เฟสคอมไพเลอร์จะแปลงInteger a = 1000, b = 1000;เป็นInteger a = Integer.valueOf(1000), b = Integer.valueOf(1000);.
ดังนั้นจึงเป็นInteger.valueOf()เมธอดที่ให้อ็อบเจ็กต์จำนวนเต็มและถ้าเราดูซอร์สโค้ดของInteger.valueOf()เมธอดเราจะเห็นอย่างชัดเจนว่าเมธอดเก็บอ็อบเจ็กต์จำนวนเต็มในช่วง -128 ถึง 127 (รวม)
/**
*
* 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);
}
ดังนั้นแทนที่จะสร้างและส่งคืนอ็อบเจ็กต์จำนวนเต็มใหม่Integer.valueOf()เมธอดจะส่งคืนอ็อบเจ็กต์จำนวนเต็มจากภายในIntegerCacheหากลิเทอรัล int ที่ผ่านมีค่ามากกว่า -128 และน้อยกว่า 127
Java แคชอ็อบเจ็กต์จำนวนเต็มเหล่านี้เนื่องจากช่วงของจำนวนเต็มนี้ถูกใช้มากในการเขียนโปรแกรมแบบวันต่อวันซึ่งจะช่วยประหยัดหน่วยความจำทางอ้อม
แคชจะเริ่มต้นในการใช้งานครั้งแรกเมื่อคลาสถูกโหลดลงในหน่วยความจำเนื่องจากบล็อกแบบคงที่ ช่วงสูงสุดของแคชสามารถควบคุมได้โดย-XX:AutoBoxCacheMaxตัวเลือก JVM
ลักษณะการทำงานของแคชนี้ไม่สามารถใช้ได้กับอ็อบเจ็กต์จำนวนเต็มเท่านั้นคล้ายกับ Integer InterCache ที่เรามีByteCache, ShortCache, LongCache, CharacterCacheให้Byte, Short, Long, Characterตามลำดับ
คุณสามารถอ่านเพิ่มเติมเกี่ยวกับบทความของฉันJava จำนวนเต็มแคช - ทำไม Integer.valueOf (127) == Integer.valueOf (127) เป็นจริง