ในJava ที่มีประสิทธิภาพของ Joshua Bloch รายการที่ 5: "หลีกเลี่ยงการสร้างวัตถุที่ไม่จำเป็น" เขาโพสต์ตัวอย่างโค้ดต่อไปนี้:
public static void main(String[] args) {
Long sum = 0L; // uses Long, not long
for (long i = 0; i <= Integer.MAX_VALUE; i++) {
sum += i;
}
System.out.println(sum);
}
และใช้เวลา 43 วินาทีในการเรียกใช้ การใช้ Long เข้าสู่ดึกดำบรรพ์นั้นจะลดลงเป็น 6.8 วินาที ... หากนั่นเป็นข้อบ่งชี้ว่าทำไมเราถึงใช้ primitives
ขาดความเสมอภาคค่าพื้นเมืองยังเป็นกังวล ( .equals()
ค่อนข้าง verbose เมื่อเทียบกับ==
)
สำหรับ biziclop:
class Biziclop {
public static void main(String[] args) {
System.out.println(new Integer(5) == new Integer(5));
System.out.println(new Integer(500) == new Integer(500));
System.out.println(Integer.valueOf(5) == Integer.valueOf(5));
System.out.println(Integer.valueOf(500) == Integer.valueOf(500));
}
}
ผลลัพธ์ใน:
false
false
true
false
แก้ไข ทำไม (3) ผลตอบแทนtrue
และ (4) การกลับมาfalse
?
เพราะมันเป็นวัตถุสองอย่างที่แตกต่างกัน จำนวนเต็ม 256 ที่ใกล้เคียงกับศูนย์ [-128; 127] ถูกแคชโดย JVM ดังนั้นพวกเขาจึงส่งคืนวัตถุเดียวกันสำหรับวัตถุเหล่านั้น นอกเหนือจากช่วงนั้นแม้ว่ามันจะไม่ถูกแคชดังนั้นจึงมีการสร้างวัตถุใหม่ เพื่อให้สิ่งต่าง ๆ มีความซับซ้อน JLS ต้องการให้มีน้ำหนักอย่างน้อย 256 fly แคช ผู้ดำเนินการ JVM อาจเพิ่มมากขึ้นหากพวกเขาต้องการซึ่งหมายความว่าสิ่งนี้สามารถทำงานบนระบบที่แคช 1024 ที่ใกล้ที่สุดและทั้งหมดกลับเป็นจริง ... #awkward