การกำหนด 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) เป็นจริง