ประเภทข้อมูลใน Java สามารถแบ่งออกเป็นสองประเภท:
1. ชนิดข้อมูลพื้นฐาน หรือที่เรียกว่าชนิดข้อมูลดั้งเดิม หากต้องการเปรียบเทียบไบต์, แบบสั้น, ถ่าน, int, ยาว, ลอย, สองเท่า, บูลีน ให้ใช้เครื่องหมายเท่ากับคู่ (==) และเปรียบเทียบค่าต่างๆ
2. ประเภทข้อมูลคอมโพสิต (คลาส) เมื่อเปรียบเทียบโดยใช้ (==) พวกเขาจะถูกเปรียบเทียบกับที่เก็บข้อมูลในหน่วยความจำ ดังนั้น เว้นแต่จะเป็นออบเจ็กต์ใหม่เดียวกัน ผลลัพธ์ของการเปรียบเทียบจะเป็นจริง มิฉะนั้นการเปรียบเทียบ ผลลัพธ์เป็นเท็จ คลาสทั้งหมดใน JAVA สืบทอดมาจากคลาสพื้นฐาน Object คลาสพื้นฐานใน Object กำหนดวิธีการเท่ากับ , Integer และ Date เท่ากับ มีการใช้งานของตัวเองในคลาสเหล่านี้ แทนที่จะเปรียบเทียบที่อยู่หน่วยเก็บข้อมูลของคลาสในหน่วยความจำฮีป สำหรับการเปรียบเทียบที่เท่ากันระหว่างประเภทข้อมูลคอมโพสิต โดยไม่มีการแทนที่วิธีเท่ากับ การเปรียบเทียบระหว่างประเภทข้อมูลเหล่านั้นยังคงขึ้นอยู่กับค่าที่อยู่ของตำแหน่งที่เก็บข้อมูลในหน่วยความจำ เนื่องจากวิธีเท่ากับของ Object ยังใช้เครื่องหมายเท่ากับสองเท่า ( ==) อีกด้วย ดังนั้นผลลัพธ์ของการเปรียบเทียบจึงเหมือนกับผลลัพธ์ของเครื่องหมายเท่ากับคู่ (==)
คัดลอกรหัสรหัส ดังต่อไปนี้:
สตริงการทดสอบคลาสสาธารณะ {
publicstaticvoid หลัก (สตริง [] args) {
สตริง s1="วันจันทร์";
สตริง s2="วันจันทร์";
ถ้า (s1 == s2)
-
System.out.println("s1 == s2");}
อื่น{
System.out.println("s1 != s2");}
-
-
คอมไพล์และรันโปรแกรม เอาต์พุต: s1 == s2 หมายเหตุ: s1 และ s2 อ้างถึงออบเจ็กต์ String เดียวกัน - "วันจันทร์" 2. หากคุณเปลี่ยนโปรแกรมเล็กน้อย คุณจะพบกับบางสิ่งที่แปลกยิ่งกว่า:
คัดลอกรหัสรหัส ดังต่อไปนี้:
สตริงการทดสอบคลาสสาธารณะ {
publicstaticvoid หลัก (สตริง [] args)
-
สตริง s1="วันจันทร์";
String s2 =สตริงใหม่("วันจันทร์");
ถ้า (s1 == s2) {System.out.println ("s1 == s2");
-
อื่น
-
System.out.println("s1 != s2");
-
ถ้า (s1.เท่ากับ(s2))
-
System.out.println("s1 เท่ากับ s2");
-
อื่น
-
System.out.println("s1 ไม่เท่ากับ s2");
-
-
-
เราใช้โอเปอเรเตอร์ใหม่เพื่อสร้างเอาต์พุตโปรแกรมสำหรับ s2: s1 != s2 s1 เท่ากับ s2 หมายเหตุ: s1 และ s2 อ้างอิงถึงวัตถุสตริง "วันจันทร์" สองวัตถุตามลำดับ
3. String buffer pool ปรากฎว่าโปรแกรมจะสร้าง string buffer pool เมื่อรันอยู่ เมื่อใช้นิพจน์เช่น s2 = "Monday" เพื่อสร้าง string โปรแกรมจะค้นหาค่าเดียวกันใน String ก่อน บัฟเฟอร์พูล ในโปรแกรมแรก s1 จะถูกใส่ลงในพูล ดังนั้นเมื่อ s2 ถูกสร้างขึ้น โปรแกรมจะพบ s1 ที่มีค่าเท่ากันและอ้างอิง s2 ไปยังอ็อบเจ็กต์ "Monday" ที่อ้างอิงโดย s1 ในโปรแกรมที่สอง ใช้ใหม่ โอเปอเรเตอร์เขาบอกโปรแกรมอย่างชัดเจน: "ฉันต้องการอันใหม่! ไม่ใช่อันเก่า!" ดังนั้นวัตถุ Sting "วันจันทร์" ใหม่จึงถูกสร้างขึ้นในหน่วยความจำ ค่านิยมของพวกเขาจะเหมือนกันแต่สถานที่ของพวกเขาแตกต่างกัน คนหนึ่งกำลังว่ายน้ำในสระ และอีกคนกำลังพักผ่อนบนฝั่ง อ้าว เปลืองทรัพยากร ทำไมเราถึงต้องแยกพวกมันออกเมื่อเห็นชัดว่าเหมือนกัน?
4. เปลี่ยนโปรแกรมอีกครั้ง:
คัดลอกรหัสรหัส ดังต่อไปนี้:
TestString คลาสสาธารณะ
-
publicstaticvoid หลัก (สตริง [] args)
-
สตริง s1="วันจันทร์";
String s2 =สตริงใหม่("วันจันทร์");
s2 = s2.ฝึกงาน();
ถ้า (s1 == s2)
-
System.out.println("s1 == s2");
-
อื่น
-
System.out.println("s1 != s2");
-
ถ้า (s1.เท่ากับ(s2))
-
System.out.println("s1 เท่ากับ s2");
-
อื่น
-
System.out.println("s1 ไม่เท่ากับ s2");
-
-
-
เพิ่มครั้งนี้: s2 = s2.intern(); เอาต์พุตของโปรแกรม: s1 == s2 s1 เท่ากับ s2 ปรากฎว่า (เมธอด intern() ของ java.lang.String "abc" ค่าที่ส่งคืนของเมธอด intern() ยังคงเป็นสตริง "abc" ดูเผินๆ ดูเหมือนว่าวิธีนี้ไม่มีประโยชน์ แต่ ในความเป็นจริงมันเป็นกลอุบายเล็กน้อย: ตรวจสอบว่ามีสตริง "abc" อยู่ในพูลสตริงหรือไม่ หากมี ให้ส่งคืนสตริงในพูล หากไม่มีอยู่ เมธอดนี้จะเพิ่ม "abc" ลงในสตริง รวมแล้วส่งคืนการอ้างอิง)