ฉันไม่แน่ใจเกี่ยวกับ JavaScript แต่ใน Java สตริงมีขั้นตอนเพิ่มเติมในการไม่เปลี่ยนรูปโดยใช้ "String Constant Pool" สตริงสามารถสร้างด้วยตัวอักษรสตริง ( "foo") หรือด้วยตัวStringสร้างคลาส สตริงที่สร้างด้วยลิเทอรัลสตริงเป็นส่วนหนึ่งของ String Constant Pool และลิเทอรัลสตริงเดียวกันจะเป็นแอดเดรสหน่วยความจำเดียวกันจากพูลเสมอ
ตัวอย่าง:
String lit1 = "foo";
String lit2 = "foo";
String cons = new String("foo");
System.out.println(lit1 == lit2); // true
System.out.println(lit1 == cons); // false
System.out.println(lit1.equals(cons)); // true
ในข้างต้นทั้งสองlit1และlit2สร้างโดยใช้ลิเทอรัลสตริงเดียวกันดังนั้นจึงชี้ไปที่ที่อยู่หน่วยความจำเดียวกัน lit1 == lit2ผลลัพธ์ในtrueให้เนื่องจากเป็นวัตถุเดียวกัน
อย่างไรก็ตามconsสร้างขึ้นโดยใช้ตัวสร้างคลาส แม้ว่าพารามิเตอร์จะเป็นค่าคงที่สตริงเดียวกัน แต่คอนสตรัคเตอร์จะจัดสรรหน่วยความจำใหม่ให้consซึ่งหมายความว่าconsไม่ใช่อ็อบเจ็กต์เดียวกับlit1และlit2แม้ว่าจะมีข้อมูลเดียวกันก็ตาม
แน่นอนเนื่องจากสตริงทั้งสามมีข้อมูลอักขระเดียวกันการใช้equalsวิธีนี้จะคืนค่าจริง
(โครงสร้างสตริงทั้งสองประเภทไม่เปลี่ยนรูปแน่นอน)