assertEqualsใช้equalsวิธีการเปรียบเทียบ มีการยืนยันที่แตกต่างกันassertSameซึ่งใช้ตัว==ดำเนินการ
เพื่อให้เข้าใจว่าทำไม==ไม่ควรใช้กับสตริงคุณต้องเข้าใจว่าอะไร==: มันทำการตรวจสอบตัวตน นั่นคือa == bการตรวจสอบเพื่อดูว่าaและbอ้างถึงวัตถุเดียวกัน มันถูกสร้างขึ้นในภาษาและพฤติกรรมของมันไม่สามารถเปลี่ยนแปลงได้โดยชั้นเรียนที่แตกต่างกัน ในทางกลับกันequalsวิธีการสามารถถูกแทนที่โดยชั้นเรียน ในขณะที่พฤติกรรมเริ่มต้นของมัน (ในObjectชั้นเรียน) คือการทำการตรวจสอบตัวตนโดยใช้ตัว==ดำเนินการหลายชั้นรวมถึงการStringแทนที่เพื่อทำการตรวจสอบ "เทียบเท่า" แทน ในกรณีของStringแทนที่จะตรวจสอบว่าaและbอ้างถึงวัตถุเดียวกันa.equals(b) ตรวจสอบเพื่อดูว่าวัตถุที่พวกเขาอ้างถึงนั้นเป็นทั้งสายอักขระที่มีอักขระเหมือนกันทั้งหมดหรือไม่
เวลาเปรียบเทียบ: ลองนึกภาพว่าStringวัตถุแต่ละชิ้นเป็นกระดาษที่มีบางสิ่งเขียนอยู่ สมมติว่าฉันมีกระดาษสองแผ่นที่เขียนด้วย "Foo" ลงบนพวกเขาและอีกชิ้นที่เขียนด้วย "บาร์" ไว้ ถ้าฉันเอากระดาษสองชิ้นแรกมาและใช้==เพื่อเปรียบเทียบมันจะกลับมาfalseเพราะมันเป็นคำถามที่ถามว่า ไม่จำเป็นต้องดูสิ่งที่เขียนบนกระดาษ ความจริงที่ว่าฉันให้มันสองชิ้นส่วนของกระดาษ (มากกว่าหนึ่งเดียวกันสองครั้ง) falseหมายความว่ามันจะกลับมา หากฉันใช้equalsแต่equalsวิธีการที่จะอ่านสองชิ้นของกระดาษและเห็นว่าพวกเขาพูดในสิ่งเดียวกัน ( "ฟู") trueและดังนั้นจึงจะกลับ
บิตที่ทำให้สับสนกับ Strings คือ Java มีแนวคิดของ "interning" Strings และนี่คือ (อย่างมีประสิทธิภาพ) ดำเนินการโดยอัตโนมัติในตัวอักษรสตริงใด ๆ ในรหัสของคุณ ซึ่งหมายความว่าหากคุณมีตัวอักษรสตริงเทียบเท่าสองตัวในรหัสของคุณ (แม้ว่าพวกเขาจะอยู่ในชั้นเรียนที่แตกต่างกัน) พวกเขาทั้งสองจะอ้างถึงStringวัตถุเดียวกัน สิ่งนี้ทำให้==ผู้ปฏิบัติงานกลับมาtrueบ่อยกว่าที่คาดไว้