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
บ่อยกว่าที่คาดไว้