Дар Java, вақте ки Integer a = 127 ва int b = 127, инчунин Integer a1 = 128 ва int b1 = 128 муқоиса карда мешаванд, чӣ рӯй медиҳад? Тавзеҳ диҳед, ки чаро натиҷаҳои муқоиса фарқ мекунанд.
sobes.tech AI
Ҷавоб аз AI
เมื่อเปรียบเทียบ Integer a = 127 และ int b = 127 โดยใช้ตัวดำเนินการ == ผลลัพธ์จะเป็น true สาเหตุเป็นเพราะ autoboxing (autoboxing) ของ int b ไปเป็นออบเจกต์ Integer และเนื่องจากค่าที่ 127 อยู่ในช่วงของออบเจกต์ Integer ที่ถูกแคชไว้ (โดยค่าเริ่มต้นจาก -128 ถึง 127) Java จะใช้พูลของออบเจกต์สำหรับค่านี้ ดังนั้น a และ b ที่บรรจุไว้จึงชี้ไปยังออบเจกต์เดียวกัน
เมื่อเปรียบเทียบ Integer a1 = 128 และ int b1 = 128 ผลลัพธ์ของ == จะเป็น false ถึงแม้ว่า b1 ก็จะถูกบรรจุเป็นออบเจกต์ Integer อัตโนมัติ แต่ค่าที่ 128 อยู่ นอก ช่วงของออบเจกต์ที่ถูกแคชไว้ ดังนั้นในระหว่าง autoboxing จะสร้างออบเจกต์ Integer ใหม่สำหรับ b1 การอ้างอิง a1 และ b1 ที่บรรจุไว้จึงชี้ไปยังออบเจกต์ที่แตกต่างกันใน heap ถึงแม้ค่าตัวเลขจะเท่ากันก็ตาม
สำหรับการเปรียบเทียบค่าของออบเจกต์ห่อ (เช่น Integer) ควรใช้เมธอด equals()
// การเปรียบเทียบค่าของออบเจกต์
Integer a = 127;
int b = 127;
System.out.println(a == b); // true (autoboxing และ caching ของ Integer)
System.out.println(a.equals(b)); // true (เปรียบเทียบค่าของออบเจกต์)
Integer a1 = 128;
int b1 = 128;
System.out.println(a1 == b1); // false (autoboxing, แต่ไม่มี cache สำหรับค่านี้)
System.out.println(a1.equals(b1)); // true (เปรียบเทียบค่าของออบเจกต์)
Integer a2 = new Integer(127); // สร้างออบเจกต์ใหม่ ถึงแม้ว่าค่าจะอยู่ใน cache
Integer a3 = new Integer(127);
System.out.println(a2 == a3); // false (ออบเจกต์คนละตัว)
System.out.println(a2.equals(a3)); // true (เปรียบเทียบค่าของออบเจกต์)
ดังนั้น == จะเปรียบเทียบที่อยู่ของออบเจกต์สำหรับชนิดห่อหุ้ม ในขณะที่สำหรับเปรียบเทียบค่าของชนิด primitive หรือค่าของออบเจกต์ห่อ ควรใช้ equals() การแคชของ Integer สำหรับช่วง [-128, 127] ส่งผลต่อผลลัพธ์ของ == เมื่อทำงานกับตัวเลขในช่วงนี้