String constant pool and why "MyString" == "MyString"

ช่วงนี้จาวาอาจจะเยอะหน่อย เนื่องจากเริ่มทำงานแล้วได้พวกนี้มาเรียนอื้อเลย ><” อยาก แรก ทำไม ด้านบนเมื่อเทียบกันแล้วได้ค่าเป็นจริง ทั้งๆ หากนำ Object มาเทียบกันโดยปกติแล้ว จะเป็นเท็จ จริงๆ แล้วเกิดจากที่ Compiler นั้นเก็บค่าเหล่านั้นไว้ใน Constant pool ซึ่งโดยปกติไว้เก็บชื่อคลาส ชื่อตัวแปรต่างๆ ไว้ เพื่อให้ประหยัดเนื้อที่จากการใช้ String ต่างๆ เมื่อ JVM มาอ่านแล้วเจอว่า String นี้มีอยู่ใน Constant pool ก็จะสร้าง Object มาเพียงก้อนเดียว หากมีการสร้างตัวแปลและกำหนดค่าให้กับ String ที่อยู่ใน constant pool อีก JVM ก็จะทำแค่ชี้ไปที่ Object เดิมที่สร้างไว้แล้วเท่านั้นแต่การทำเช่นนี้มีเพียงกรณีที่สร้าง String จากเครื่องหมาย “” เท่านั้น หากใช้ keyword new ในการสร้าง Object JVM ก็จะสร้างใน heap memory เหมือน Object ทั่วไป หากนำมาเปรียบเทียบก็จะได้ผลเป็นเท็จเหมือนเดิมนอกจากนี้กรณีนี้ขึ้นอยู่กับ JVM ที่ใช้ด้วย หากเป็น JVM ที่ไม่รองรับแล้ว ผลที่ได้ก็คือ เท็จเหมือนกัน

About llun

Just a programmer

, ,