ฉันไม่แน่ใจเกี่ยวกับ 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
วิธีนี้จะคืนค่าจริง
(โครงสร้างสตริงทั้งสองประเภทไม่เปลี่ยนรูปแน่นอน)