Saya tahu ==
ada beberapa masalah saat membandingkan dua Strings
. Tampaknya itu String.equals()
adalah pendekatan yang lebih baik. Yah, saya sedang melakukan pengujian JUnit dan kecenderungan saya adalah untuk digunakan assertEquals(str1, str2)
. Apakah ini cara yang dapat diandalkan untuk menyatakan dua String berisi konten yang sama? Saya akan menggunakan assertTrue(str1.equals(str2))
, tetapi kemudian Anda tidak mendapatkan manfaat dari melihat apa yang diharapkan dan nilai aktual pada kegagalan.
Pada catatan terkait, apakah ada orang yang memiliki tautan ke halaman atau utas yang menjelaskan masalah dengan jelas str1 == str2
?
Jawaban:
Anda harus selalu menggunakan
.equals()
ketika membandingkanStrings
di Jawa.JUnit memanggil
.equals()
metode untuk menentukan kesetaraan dalam metodeassertEquals(Object o1, Object o2)
.Jadi, Anda pasti aman menggunakannya
assertEquals(string1, string2)
. (KarenaString
s adalahObject
s)Berikut ini tautan ke pertanyaan Stackoverflow yang hebat mengenai beberapa perbedaan antara
==
dan.equals()
.sumber
assertEquals
menggunakanequals
metode untuk perbandingan. Ada pernyataan berbedaassertSame
,, 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 apakaha
danb
merujuk ke objek yang sama . Itu dibangun ke dalam bahasa, dan perilakunya tidak dapat diubah oleh kelas yang berbeda. Theequals
metode, di sisi lain, dapat ditimpa oleh kelas. Sementara perilaku default-nya (diObject
kelas) adalah melakukan pemeriksaan identitas menggunakan==
operator, banyak kelas, termasukString
, menimpanya untuk melakukan pemeriksaan "ekivalensi". Dalam halString
, alih-alih memeriksa jikaa
danb
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 kembalifalse
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 kembalifalse
.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 kembalitrue
.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 kembalitrue
lebih sering daripada yang diharapkan.sumber
Singkatnya - Anda dapat memiliki dua objek String yang berisi karakter yang sama tetapi objek yang berbeda (di lokasi memori yang berbeda). Operator == memeriksa untuk melihat bahwa dua referensi menunjuk ke objek yang sama (lokasi memori), tetapi metode equals () memeriksa apakah karakternya sama.
Biasanya Anda tertarik untuk memeriksa apakah dua String berisi karakter yang sama, bukan apakah mereka menunjuk ke lokasi memori yang sama.
sumber
sumber
Ya, ini digunakan sepanjang waktu untuk pengujian. Sangat mungkin bahwa kerangka kerja pengujian menggunakan .equals () untuk perbandingan seperti ini.
Di bawah ini adalah tautan yang menjelaskan "kesalahan kesetaraan string". Intinya, string di Jawa adalah objek, dan ketika Anda membandingkan kesetaraan objek, biasanya string itu didasarkan pada alamat memori, dan bukan berdasarkan konten. Karena itu, dua string tidak akan menempati alamat yang sama, bahkan jika kontennya identik, sehingga tidak akan cocok dengan benar, meskipun mereka terlihat sama ketika dicetak.
http://blog.enrii.com/2006/03/15/java-string-equality-common-mistake/
sumber
JUnit
assertEquals(obj1, obj2)
memang memanggilobj1.equals(obj2)
.Ada juga
assertSame(obj1, obj2)
yang tidakobj1 == obj2
(yaitu, memverifikasi ituobj1
danobj2
merujuk contoh yang sama ), yang adalah apa yang Anda coba hindari.Jadi kamu baik-baik saja.
sumber
http://leepoint.net/notes-java/data/strings/12stringcomparison.html
String
adalahObject
dalam java, jadi termasuk dalam kategori aturan perbandingan.sumber