ก่อนอื่นเราควรชัดเจนว่ายังมีความแตกต่างในวิธีการฝึกงานของคลาสสตริงใน JDK1.6 และ JDK1.7:
ฝึกงานใน JDK1.6:
เมื่อเรียกใช้วิธีการฝึกงานก่อนอื่นให้ไปที่พูลคงที่เพื่อดูว่ามีค่าเท่ากับค่าสตริงปัจจุบันอยู่หรือไม่ หากมีอยู่มันจะส่งคืนการอ้างอิงโดยตรงไปยังค่าสตริงในพูลคงที่ หากไม่มีอยู่สตริงจากกองเดิมจะถูกคัดลอกไปยังสระคงที่
ฝึกงานใน JDK1.7:
เมื่อเรียกใช้วิธีการฝึกงานก่อนอื่นให้ไปที่พูลคงที่เพื่อดูว่ามีค่าเท่ากับค่าสตริงปัจจุบันอยู่หรือไม่ หากมีอยู่มันจะส่งคืนการอ้างอิงโดยตรงไปยังค่าสตริงในพูลคงที่ หากไม่มีอยู่มันจะวางการอ้างอิงไปยังกองเดิมในพูลคงที่และจะไม่คัดลอกสตริงทั้งหมดลงในพูลคงที่
ซึ่งหมายความว่า JDK1.6 และ JDK1.7 จัดการแตกต่างกันเมื่อสตริงนี้ไม่มีอยู่ในพูลคงที่
ต่อไปนี้เป็นตัวอย่างในการตรวจสอบและอธิบาย:
ตัวอย่าง:
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {string str = "str"+สตริงใหม่ ("01"); ① str.intern (); ② string str1 = "str01"; ③ system.out.println (str == str1); string str2 = สตริงใหม่ ("str01"); ④ str2.intern (); ⑤ string str3 = "str01"; ⑥ system.out.println (str2 == str3); string str4 = "str01"; ⑦ string str5 = สตริงใหม่ ("str")+สตริงใหม่ ("01"); ⑧ str5.intern (); ⑨ system.out.println (str4 == str5); ใน jdk1.6 ผลลัพธ์ผลลัพธ์คือ:
เท็จ
เท็จ
เท็จ
อธิบาย:
①ในระหว่างการดำเนินการจะมีการสร้างวัตถุสตริงที่มีค่า "STR01" ในหน่วยความจำฮีปและค่าคงที่ "STR" และ "01" จะถูกสร้างขึ้นในพูลคงที่
②เมื่อดำเนินการก่อนอื่นให้ไปที่พูลคงที่เพื่อตรวจสอบว่ามีค่าคงที่ของ "STR01" และพบว่าไม่มีอยู่จริง วิธีการของ JDK1.6 คือการสร้างสำเนาของสตริง "STR01" ในพูลคงที่
③ในระหว่างการดำเนินการวัตถุ "STR01" จะถูกสร้างขึ้นในสระคงที่และจะพบว่ามีอยู่แล้วดังนั้นมันจะไม่ถูกสร้างขึ้นใหม่
เหตุผลสำหรับเอาต์พุตแรกที่เป็นเท็จคือ STR ชี้ไปที่ "STR01" ในหน่วยความจำฮีปในขณะที่ STR1 ชี้ไปที่ "STR01" ในสระคงที่
④เมื่อดำเนินการวัตถุสตริง str2 ที่มีค่าของ "str01" จะถูกสร้างขึ้นในหน่วยความจำฮีปและค่าคงที่ที่มีค่าของ "str01" จะถูกสร้างขึ้นในพูลคงที่;
⑤เมื่อดำเนินการก่อนอื่นไปที่พูลคงที่เพื่อตรวจสอบว่ามีค่าคงที่ของ "str01" หรือไม่ เมื่อพบว่ามีอยู่มันจะส่งคืนการอ้างอิงคงที่นี้โดยตรง
⑥ในระหว่างการดำเนินการค่าคงที่ของ "STR01" จะถูกสร้างขึ้นในพูลคงที่ หากพบว่ามีอยู่แล้วมันจะไม่ถูกสร้างขึ้น
เหตุผลสำหรับเอาต์พุตที่สองเท็จคือ STR2 ชี้ไปที่ "STR01" ในหน่วยความจำฮีปในขณะที่ STR3 ชี้ไปที่ "STR01" ในสระคงที่
⑦ในระหว่างการดำเนินการค่าคงที่ของ "STR01" จะถูกสร้างขึ้นในสระคงที่
⑧เมื่อดำเนินการวัตถุสตริง str5 ที่มีค่า "str01" จะถูกสร้างขึ้นในหน่วยความจำฮีปและค่าคงที่ "str" และ "01" จะถูกสร้างขึ้นในสระคงที่
⑨เมื่อดำเนินการพูลคงที่จะถูกใช้เพื่อตรวจสอบว่ามีค่าคงที่ของ "STR01" หรือไม่ หากพบมันจะส่งคืนการอ้างอิงคงที่นี้โดยตรง
เหตุผลสำหรับเอาต์พุตที่สามเท็จคือ STR5 ชี้ไปที่ "STR01" ในหน่วยความจำฮีปในขณะที่ STR4 ชี้ไปที่ "STR01" ในสระคงที่
ใน jdk1.7 ผลลัพธ์ผลลัพธ์คือ:
จริง
เท็จ
เท็จ
อธิบาย:
ฉันพบว่ามีเพียงผลลัพธ์ผลลัพธ์แรกที่แตกต่างกันดังนั้นเราจึงอธิบายเหตุผลสำหรับสิ่งแรกเท่านั้น:
①ในระหว่างการดำเนินการจะมีการสร้างวัตถุสตริงที่มีค่า "STR01" ในหน่วยความจำฮีปและค่าคงที่ "STR" และ "01" จะถูกสร้างขึ้นในพูลคงที่ (สิ่งนี้ไม่แตกต่างจาก JDK1.6)
②เมื่อดำเนินการก่อนอื่นให้ไปที่พูลคงที่เพื่อตรวจสอบว่ามีค่าคงที่ของ "STR01" และพบว่าไม่มีอยู่จริง วิธีการของ JDK1.7 คือการคัดลอกการอ้างอิงของ "STR01" ในหน่วยความจำฮีปไปยังพูลคงที่
③ในระหว่างการดำเนินการวัตถุ "STR01" จะถูกสร้างขึ้นในสระคงที่และจะพบว่ามีอยู่แล้วดังนั้นมันจะไม่ถูกสร้างขึ้นใหม่
จากนั้นในเวลานี้ STR และ STR1 จะชี้ไปที่ค่าของ "STR01" ในหน่วยความจำฮีปดังนั้นทั้งสองจึงเท่ากัน
ข้างต้นเป็นการเปรียบเทียบวิธีการฝึกงานของคลาสสตริงใน JDK1.6 และ JDK1.7 มีความแตกต่าง เพื่อนที่ต้องการมันสามารถอ้างถึงมันได้