แม้ว่าคำถามเกี่ยวกับสตริง Java "==" และ "เท่ากับ" จะเป็นคำถามพื้นฐานที่สุดในการเรียนรู้ Java แต่ก็ยังมีนักเรียนจำนวนมากที่เพิ่งเรียน Java ที่ไม่ชัดเจนเกี่ยวกับหลักการ ฉันเพิ่งหารือเกี่ยวกับปัญหานี้กับเพื่อนของฉัน ดังนั้นฉันจึงเขียนบทความเพื่อแบ่งปันความเข้าใจของฉันเองกับคุณ
ก่อนอื่นเรามาดูตัวอย่างกันก่อน:
คัดลอกรหัสรหัส ดังต่อไปนี้:
TestStringEquals ระดับสาธารณะ {
โมฆะคงที่สาธารณะ main (String [] args) {
สตริง a = "ทดสอบ";
สตริง b = "ทดสอบ";
สตริง c = สตริงใหม่ ("ทดสอบ");
สตริง d = สตริงใหม่ ("ทดสอบ");
สตริง e = a;
สตริง f = สตริงใหม่ (a);
สตริง g = a + "";
System.out.println(a == b ? "expression /"a==b/" เป็นจริง"
: "expression /"a==b/" เป็นเท็จ");
System.out.println(a == c ? "expression /"a==c/" เป็นจริง"
: "expression /"a==c/" เป็นเท็จ");
System.out.println(c == d ? "expression /"c==d/" เป็นจริง"
: "expression /"c==d/" เป็นเท็จ");
System.out.println(a == e ? "expression /"a==e/" เป็นจริง"
: "expression /"a==e/" เป็นเท็จ");
System.out.println(a == f ? "expression /"a==f/" เป็นจริง"
: "expression /"a==f/" เป็นเท็จ");
System.out.println(a == g ? "expression /"a==g/" เป็นจริง"
: "expression /"a==g/" เป็นเท็จ");
ถ้า (a.equals(b) && b.equals(c) && c.equals(d) && d.equals(e)
&& e.equals(f) && f.equals(g)) {
ระบบออก
.println("a equals b equals c equals d equals e equals f equals g");
-
-
-
如果先不答案,大家试着去做一做,能否保证全部正确呢?
คำตอบมีการประกาศด้านล่าง:
คัดลอกรหัสรหัส ดังต่อไปนี้:
นิพจน์ "a==b" เป็นจริง
นิพจน์ "a==c" เป็นเท็จ
นิพจน์ "c==d" เป็นเท็จ
นิพจน์ "a==e" เป็นจริง
นิพจน์ "a==f" เป็นเท็จ
นิพจน์ "a==g" เป็นเท็จ
<div style="text-align: left;"></div>a equals b equals c equals d equals e equals f equals g
เพื่อให้เข้าใจปัญหาประเภทนี้ได้ดี วิธีที่ดีที่สุดคือการมีความเข้าใจอย่างลึกซึ้งเกี่ยวกับกลไกและหลักการของวิธี "==" และวิธี "เท่ากับ" ของ String ใน Java ทุกคนต้องรู้ว่า "เท่ากับ" คือการเปรียบเทียบเนื้อหาของสตริง เนื่องจากเนื้อหาสตริงทั้งหมดในโปรแกรมข้างต้นเป็น "ทดสอบ" ทั้งหมดจะเท่ากันเมื่อเปรียบเทียบกับเท่ากับ
แต่คุณรู้หรือไม่ว่าวิธีการเท่ากับและวิธี "==" ของคลาสพื้นฐาน Object ใน Java นั้นเหมือนกันจริง ๆ ? เพียงว่าหลังจากที่คลาส String สืบทอดคลาส Object (คลาสทั้งหมดใน Java สืบทอดคลาส Object) มันจะโอเวอร์โหลดวิธีการเท่ากัน ทำให้เป็นการเปรียบเทียบเนื้อหาของสตริง
หลังจากมีความเข้าใจเรื่องความเท่าเทียมกันเป็นอย่างดีแล้ว ให้เราศึกษาความซับซ้อนของเมธอด "==" กัน
"==" เป็นตัวดำเนินการใน Java เนื้อหาที่เปรียบเทียบคือตัวชี้ของวัตถุสองตัวซึ่งเป็นที่อยู่ของวัตถุจริง ดังนั้นจึงง่ายที่จะเข้าใจว่า e==a ส่งคืนค่าจริง
ลองดูการเปรียบเทียบระหว่าง c และ d อีกครั้ง เมื่อเราเห็นคีย์เวิร์ดใหม่ หมายความว่าทั้ง c และ d ได้ใช้ที่อยู่หน่วยความจำอีกครั้ง จากนั้นกำหนดค่า "test" ดังนั้น c==d จึงส่งกลับค่า false ก็เข้าใจได้เหมือนกัน
การดำเนินการ "==" ระหว่าง a, c, d และ f ทั้งหมดจะส่งกลับค่าเท็จ
จากนั้นเรามาดูที่ g= a + “” แม้ว่าเราจะไม่เห็นคีย์เวิร์ดใหม่ เนื่องจากตัวดำเนินการคลาส String “+” มีโอเวอร์โหลด สตริงใหม่จะถูกเพิ่มในเมธอดโอเวอร์โหลดอย่างแน่นอน ดังนั้นมันจึงกลายเป็นแบบข้างต้น สถานการณ์. สิ่งที่ยากที่สุดที่จะเข้าใจคือการเปรียบเทียบระหว่าง a และ b อันที่จริงนี่คือผลลัพธ์ของการปรับให้เหมาะสมของคอมไพเลอร์ Java มีพื้นที่เก็บข้อมูลที่เรียกว่าพูลคงที่ของสตริงเนื่องจาก String a = "test" หลังจากคอมไพล์คำสั่งแล้ว "test" จะถูกจัดเก็บไว้ในพูลค่าคงที่สตริงนี้ จากนั้นเมื่อ b ถูกกำหนดอีกครั้ง b ยังคงชี้ไปที่พื้นที่นี้ ดังนั้น a และ b ยังคงชี้ไปที่พื้นที่เดียวกัน ดังนั้น a==b ให้ค่าเป็นจริง