"" เป็นสตริงจริงแม้ว่าจะเป็นสตริงว่าง
อย่างไรก็ตาม null หมายความว่าตัวแปร String ชี้ไปที่ไม่มีอะไร
a==b
ส่งกลับค่าเท็จเพราะ "" และโมฆะไม่ได้ใช้พื้นที่ในหน่วยความจำเท่ากันกล่าวคือตัวแปรของพวกเขาไม่ได้ชี้ไปที่วัตถุเดียวกัน
a.equals(b)
ผลตอบแทนที่ผิดเพราะ "" ไม่เท่ากับ null อย่างชัดเจน
ความแตกต่างคือเนื่องจาก "" เป็นสตริงจริงคุณยังสามารถเรียกใช้เมธอดหรือฟังก์ชั่นที่ต้องการได้
a.length()
a.substring(0, 1)
และอื่น ๆ
ถ้า String เท่ากับ null เช่น b, Java จะขว้างNullPointerException
ถ้าคุณลองเรียกใช้พูด:
b.length()
หากความแตกต่างที่คุณสงสัยคือ == เทียบกับเท่ากับนี่คือ:
== เปรียบเทียบการอ้างอิงเช่นถ้าฉันไป
String a = new String("");
String b = new String("");
System.out.println(a==b);
นั่นจะให้ผลเป็นเท็จเพราะฉันจัดสรรวัตถุสองชนิดที่แตกต่างกันและจุด a และ b ไปยังวัตถุอื่น
อย่างไรก็ตามa.equals(b)
ในกรณีนี้จะคืนค่าเป็นจริงเพราะequals
สำหรับ Strings จะคืนค่าเป็นจริงถ้าหากอาร์กิวเมนต์ของสายอักขระนั้นไม่ใช่ null และแสดงถึงลำดับของอักขระที่เหมือนกัน
ถูกเตือนว่า Java มีกรณีพิเศษสำหรับ Strings
String a = "abc";
String b = "abc";
System.out.println(a==b);
คุณจะคิดว่าผลลัพธ์จะเป็นfalse
เพราะมันควรจัดสรรสองสายที่แตกต่างกัน ที่จริงแล้ว Java จะฝึกงานสตริงตัวอักษร (คนที่เริ่มต้นเช่น a และ b ในตัวอย่างของเรา) ดังนั้นโปรดระวังเพราะนั่นอาจให้ผลบวกเท็จกับวิธีการ == ทำงาน
b.equals(a)
- แต่ไม่ใช้==
สำหรับการเปรียบเทียบสตริงเนื่องจาก "ไม่ทำงาน" ในวิธีอื่นnull
ค่า (ซึ่งแตกต่างจากสตริงที่ว่างเปล่า""
, อินสแตนซ์ที่ถูกต้อง String) จะไม่เคยมีวิธีเรียกกับมัน การวาง "รู้จักไม่เป็นโมฆะ" (มักจะเป็นค่าคงที่หรือตามตัวอักษร) ทางด้านซ้ายของความเท่าเทียมกันคือ "โยดาเงื่อนไข" หรือบางอย่างเช่น