เมื่อคุณรวบรวมตัวเลขตามตัวอักษรใน Java และกำหนดให้กับ Integer (ตัวพิมพ์ใหญ่I
) คอมไพเลอร์จะปล่อย:
Integer b2 =Integer.valueOf(127)
บรรทัดของรหัสนี้จะถูกสร้างขึ้นเช่นกันเมื่อคุณใช้การล็อกอัตโนมัติ
valueOf
มีการใช้งานโดยที่ตัวเลขบางตัวเป็น "พูล" และจะส่งคืนอินสแตนซ์เดียวกันสำหรับค่าที่น้อยกว่า 128
จากซอร์สโค้ด Java 1.6, บรรทัด 621:
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
ค่าของhigh
สามารถกำหนดค่าเป็นค่าอื่นด้วยคุณสมบัติของระบบ
-Djava.lang.Integer.IntegerCache.high = 999
หากคุณรันโปรแกรมด้วยคุณสมบัติของระบบมันจะออกจริง!
ข้อสรุปที่ชัดเจน: ไม่ต้องอ้างอิงสองคนที่เหมือนกันเสมอเปรียบเทียบกับ.equals()
วิธี
ดังนั้นb2.equals(b3)
จะพิมพ์ค่าจริงสำหรับค่า b2, b3
โปรดทราบว่าInteger
แคชไม่ได้มีไว้สำหรับเหตุผลด้านประสิทธิภาพ แต่เพื่อให้สอดคล้องกับJLS หัวข้อ 5.1.7 ; ต้องระบุเอกลักษณ์ของวัตถุสำหรับค่า -128 ถึง 127
จำนวนเต็ม # valueOf (int)ยังจัดทำเอกสารพฤติกรรมนี้:
วิธีนี้น่าจะให้ประสิทธิภาพพื้นที่และเวลาได้ดีขึ้นอย่างมีนัยสำคัญโดยการแคชค่าที่ร้องขอบ่อยๆ วิธีการนี้จะทำการแคชค่าในช่วง -128 ถึง 127, รวมและอาจแคชค่าอื่น ๆ ที่อยู่นอกช่วงนี้