assertEquals
menggunakan equals
metode untuk perbandingan. Ada pernyataan berbeda assertSame
,, yang menggunakan ==
operator.
Untuk memahami mengapa ==
tidak boleh digunakan dengan string, Anda perlu memahami apa yang ==
dilakukan: string melakukan pengecekan identitas. Artinya, a == b
periksa untuk melihat apakah a
dan b
merujuk ke objek yang sama . Itu dibangun ke dalam bahasa, dan perilakunya tidak dapat diubah oleh kelas yang berbeda. The equals
metode, di sisi lain, dapat ditimpa oleh kelas. Sementara perilaku default-nya (di Object
kelas) adalah melakukan pemeriksaan identitas menggunakan ==
operator, banyak kelas, termasuk String
, menimpanya untuk melakukan pemeriksaan "ekivalensi". Dalam hal String
, alih-alih memeriksa jika a
dan b
merujuk ke objek yang sama,a.equals(b)
memeriksa untuk melihat apakah objek yang mereka rujuk adalah kedua string yang berisi karakter yang persis sama.
Waktu analogi: bayangkan bahwa setiap String
objek adalah selembar kertas dengan sesuatu yang tertulis di atasnya. Katakanlah saya memiliki dua lembar kertas dengan "Foo" tertulis di atasnya, dan satu lagi dengan "Bar" tertulis di atasnya. Jika saya mengambil dua lembar kertas pertama dan menggunakannya ==
untuk membandingkannya, kertas itu akan kembali false
karena pada dasarnya menanyakan "apakah ini kertas yang sama?". Bahkan tidak perlu melihat apa yang tertulis di kertas. Fakta bahwa saya memberikannya dua lembar kertas (bukan yang sama dua kali) berarti kertas itu akan kembali false
. equals
Namun, jika saya menggunakan , equals
metode ini akan membaca dua lembar kertas dan melihat bahwa mereka mengatakan hal yang sama ("Foo"), dan itu akan kembali true
.
Bit yang membingungkan dengan Strings adalah bahwa Java memiliki konsep "interning" Strings, dan ini (efektif) secara otomatis dilakukan pada string literal dalam kode Anda. Ini berarti bahwa jika Anda memiliki dua string literal yang setara dalam kode Anda (bahkan jika mereka berada di kelas yang berbeda) mereka sebenarnya akan merujuk ke String
objek yang sama . Ini membuat ==
operator kembali true
lebih sering daripada yang diharapkan.