Saya telah menggunakan ==
operator dalam program saya untuk membandingkan semua string saya sejauh ini. Namun, saya menemukan bug, mengubah salah satunya .equals()
, dan memperbaiki bug.
Apakah ==
buruk? Kapan sebaiknya dan tidak boleh digunakan? Apa bedanya?
==
cara kerjanya seperti pada Objects: stackoverflow.com/a/19966154/2284641==
akan berfungsi beberapa waktu, karena java memiliki kolam String, di mana ia mencoba untuk menggunakan kembali referensi memori dari string yang biasa digunakan. Tetapi==
membandingkan bahwa objek sama, bukan nilai-nilai ... begitu.equals()
juga penggunaan yang tepat yang ingin Anda gunakan."12"=="1"+2
false (mungkin)Jawaban:
==
tes untuk persamaan referensi (apakah mereka adalah objek yang sama)..equals()
menguji kesetaraan nilai (apakah secara logis "sama").Objects.equals () memeriksa
null
sebelum memanggil.equals()
sehingga Anda tidak perlu (tersedia pada JDK7, juga tersedia di Guava ).Akibatnya, jika Anda ingin menguji apakah dua string memiliki nilai yang sama, Anda mungkin ingin menggunakannya
Objects.equals()
.Anda hampir selalu ingin menggunakannya
Objects.equals()
. Dalam situasi langka di mana Anda tahu Anda berurusan dengan string yang diinternir , Anda dapat menggunakannya==
.Dari JLS 3.10.5. String Literals :
Contoh serupa juga dapat ditemukan di JLS 3.10.5-1 .
Metode Lain Untuk Dipertimbangkan
String.equalsIgnoreCase () nilai kesetaraan yang mengabaikan case.
String.contentEquals () membandingkan konten
String
dengan konten apa sajaCharSequence
(tersedia sejak Java 1.5). Menghemat Anda dari keharusan mengubah StringBuffer Anda, dll menjadi String sebelum melakukan perbandingan kesetaraan, tetapi membiarkan null memeriksa Anda.sumber
==
memeriksa nilai suatu variabel. Ketika Anda memiliki objek, variabel yang mereferensikan objek memiliki referensi objek sebagai nilai . Dengan demikian, Anda membandingkan referensi saat membandingkan dua variabel dengan==
. Ketika membandingkan tipe data primitif sepertiint
, itu masih kasus yang sama. Variabel tipeint
memiliki integer sebagai nilai. Dengan demikian, Anda membandingkan nilai duaint
s menggunakan==
. Jikaint
nilai variabel atau angka ajaib tidak masalah. Selain itu: Sebuah referensi tidak lain hanyalah sebuah angka yang mengacu pada memori.==
menguji referensi objek,.equals()
menguji nilai string.Kadang-kadang terlihat
==
membandingkan nilai, karena Java melakukan beberapa hal di belakang layar untuk memastikan string in-line yang identik sebenarnya adalah objek yang sama.Sebagai contoh:
Namun waspadalah terhadap nol!
==
menanganinull
string dengan baik, tetapi panggilan.equals()
dari string nol akan menyebabkan pengecualian:Jadi, jika Anda tahu itu
fooString1
mungkin nol, beri tahu pembaca bahwa dengan menulisBerikut ini lebih pendek, tetapi kurang jelas untuk memeriksa null:
sumber
==
melakukan nilai-nilai selalu membandingkan! (Hanya saja nilai-nilai tertentu adalah referensi!)?.
,. Itu akan dikonversinullString1?.equals(nullString2);
menjadi pernyataan yang sepenuhnya nol. Namun, itu tidak membantu jika Anda memilikivalidString?.equals(nullString);
- itu masih melempar pengecualian.==
membandingkan referensi Objek..equals()
membandingkan nilai String.Terkadang
==
memberikan ilusi untuk membandingkan nilai String, seperti dalam kasus berikut:Ini karena ketika Anda membuat String literal apa pun, JVM pertama mencari literal tersebut di kumpulan String, dan jika menemukan kecocokan, referensi yang sama akan diberikan ke String baru. Karena itu, kita dapat:
(a == b) ===> true
Namun,
==
gagal dalam kasus berikut:Dalam hal ini untuk
new String("test")
pernyataan String baru akan dibuat di heap, dan referensi itu akan diberikan kepadab
, jadib
akan diberikan referensi di heap, bukan di string pool.Sekarang
a
menunjuk ke String di kolam String sementarab
menunjuk ke String di heap. Karena itu kita dapatkan:jika (a == b) ===> false.
Meskipun
.equals()
selalu membandingkan nilai String sehingga memberi benar dalam kedua kasus:Jadi menggunakan
.equals()
selalu lebih baik.sumber
.equals()
Metode kelas objek membandingkan instance (referensi / Alamat) di mana.equals()
metode kelas String diganti untuk membandingkan konten (karakter)String
objek untuk menghemat jejak memori sepertiString
diketahui tidak berubah (saya harap, saya katakan dengan benar di sini). Juga periksa stackoverflow.com/questions/3052442/...The
==
cek operator untuk melihat apakah dua string yang persis objek yang sama.The
.equals()
Metode akan memeriksa apakah dua string memiliki nilai yang sama.sumber
String di Jawa tidak berubah. Itu berarti setiap kali Anda mencoba mengubah / memodifikasi string Anda mendapatkan contoh baru. Anda tidak dapat mengubah string asli. Ini telah dilakukan sehingga instance string ini dapat di-cache. Sebuah program tipikal berisi banyak referensi string dan caching instance ini dapat mengurangi jejak memori dan meningkatkan kinerja program.
Saat menggunakan operator == untuk perbandingan string, Anda tidak membandingkan konten string, tetapi sebenarnya membandingkan alamat memori. Jika keduanya sama maka akan mengembalikan true dan false sebaliknya. Sedangkan equals in string membandingkan konten string.
Jadi pertanyaannya adalah jika semua string di-cache dalam sistem, mengapa
==
return salah sedangkan equal mengembalikan true? Ya, ini mungkin. Jika Anda membuat string baru sepertiString str = new String("Testing")
Anda akhirnya membuat string baru di cache bahkan jika cache sudah mengandung string yang memiliki konten yang sama. Singkatnya"MyString" == new String("MyString")
akan selalu mengembalikan false.Java juga berbicara tentang fungsi intern () yang dapat digunakan pada string untuk menjadikannya bagian dari cache sehingga
"MyString" == new String("MyString").intern()
akan mengembalikan true.Catatan: operator == jauh lebih cepat daripada yang sama hanya karena Anda membandingkan dua alamat memori, tetapi Anda perlu memastikan bahwa kode tersebut tidak membuat instance String baru dalam kode. Kalau tidak, Anda akan menemukan bug.
sumber
Pastikan Anda mengerti alasannya. Itu karena
==
perbandingan hanya membandingkan referensi; yangequals()
metode melakukan perbandingan karakter-karakter dari isi.Ketika Anda memanggil baru untuk
a
danb
, masing-masing mendapat referensi baru yang menunjuk ke"foo"
dalam tabel string. Referensi berbeda, tetapi isinya sama.sumber
Ya itu buruk ...
==
berarti bahwa dua referensi string Anda adalah objek yang persis sama. Anda mungkin pernah mendengar bahwa ini adalah kasusnya karena Java menyimpan semacam tabel literal (yang memang demikian), tetapi tidak selalu demikian. Beberapa string dimuat dengan cara yang berbeda, dibuat dari string lain, dll., Jadi Anda tidak boleh berasumsi bahwa dua string identik disimpan di lokasi yang sama.Sama dengan melakukan perbandingan nyata untuk Anda.
sumber
Ya,
==
buruk untuk membandingkan Strings (objek apa pun, kecuali Anda tahu itu kanonik).==
hanya membandingkan referensi objek..equals()
tes untuk kesetaraan. Untuk Strings, seringkali mereka akan sama tetapi seperti yang Anda temukan, itu tidak selalu dijamin.sumber
Java memiliki kumpulan String di mana Java mengelola alokasi memori untuk objek String. Lihat Kolam Tali di Jawa
Saat Anda memeriksa (membandingkan) dua objek menggunakan
==
operator, ia membandingkan kesetaraan alamat ke dalam kumpulan string. Jika dua objek String memiliki referensi alamat yang sama maka kembalitrue
, jika tidakfalse
. Tetapi jika Anda ingin membandingkan konten dari dua objek String maka Anda harus menggantiequals
metode.equals
sebenarnya adalah metode kelas Object, tetapi Overridden ke dalam kelas String dan definisi baru diberikan yang membandingkan konten objek.Tapi pikiran menghargai kasus String. Jika Anda ingin membandingkan huruf besar-kecil maka Anda harus menggunakan metode equalsIgnoreCase dari kelas String.
Ayo lihat:
sumber
equalsIgnoreCase
yang mungkin informatif untuk yang lebih segar.Saya setuju dengan jawaban dari zacherate.
Tapi yang bisa Anda lakukan adalah menelepon
intern()
string non-literal Anda.Dari contoh zacherate:
Jika Anda magang, persamaan String non-literal adalah
true
:sumber
==
untuk perbandingan string.==
membandingkan referensi objek di Jawa , dan itu tidak terkecuali untukString
objek.Untuk membandingkan konten objek yang sebenarnya (termasuk
String
), seseorang harus menggunakanequals
metode ini .Jika perbandingan dua
String
objek menggunakan==
ternyatatrue
, itu karenaString
objek diinternir, dan Java Virtual Machine memiliki beberapa titik referensi ke contoh yang samaString
. Orang seharusnya tidak berharap bahwa membandingkan satuString
objek yang berisi konten yang sama denganString
objek lain gunakan==
untuk mengevaluasi sebagaitrue
.sumber
.equals()
membandingkan data dalam suatu kelas (dengan asumsi fungsi diimplementasikan).==
membandingkan lokasi penunjuk (lokasi objek dalam memori).==
mengembalikan true jika kedua objek (TIDAK BICARA TENTANG PRIMITIF) menunjuk ke instance objek SAMA..equals()
mengembalikan true jika dua objek berisi data yang samaequals()
Versus==
di JawaItu mungkin bisa membantu Anda.
sumber
==
melakukan pemeriksaan kesetaraan referensi , apakah 2 objek (string dalam kasus ini) merujuk ke objek yang sama dalam memori.The
equals()
Metode akan memeriksa apakah isi atau negara dari 2 objek yang sama.Jelas
==
lebih cepat, tetapi akan (mungkin) memberikan hasil yang salah dalam banyak kasus jika Anda hanya ingin tahu apakah 2String
s memegang teks yang sama.equals()
Disarankan penggunaan metode ini.Jangan khawatir tentang kinerjanya. Beberapa hal untuk didorong menggunakan
String.equals()
:String.equals()
pemeriksaan pertama untuk persamaan referensi (menggunakan==
), dan jika 2 string adalah sama dengan referensi, tidak ada perhitungan lebih lanjut yang dilakukan!String.equals()
selanjutnya akan memeriksa panjang string. Ini juga merupakan operasi cepat karenaString
kelas menyimpan panjang string, tidak perlu menghitung karakter atau poin kode. Jika panjangnya berbeda, tidak ada pemeriksaan lebih lanjut dilakukan, kami tahu mereka tidak bisa sama.Ketika semua dikatakan dan dilakukan, bahkan jika kami memiliki jaminan bahwa string adalah magang, menggunakan
equals()
metode ini masih tidak overhead yang orang mungkin berpikir, pasti cara yang disarankan. Jika Anda ingin pemeriksaan referensi yang efisien, maka gunakan enums di mana dijamin oleh spesifikasi bahasa dan implementasi bahwa nilai enum yang sama akan menjadi objek yang sama (dengan referensi).sumber
Obviously == is faster
- sebenarnya pelaksanaan.equals(String)
pemeriksaan pertama==
sebelum hal lain jadi saya akan mengatakan kecepatannya hampir sama.public boolean equals(Object anObject) { if (this == anObject) { return true; } ...
Jika Anda seperti saya, ketika saya mulai menggunakan Java, saya ingin menggunakan operator "==" untuk menguji apakah dua instance String sama, tetapi untuk lebih baik atau lebih buruk, itu bukan cara yang tepat untuk melakukannya di Jawa.
Dalam tutorial ini saya akan menunjukkan beberapa cara berbeda untuk membandingkan string Java dengan benar, dimulai dengan pendekatan yang saya gunakan sebagian besar waktu. Di akhir tutorial perbandingan String Java ini saya juga akan membahas mengapa operator "==" tidak berfungsi saat membandingkan string Java.
Opsi 1: Perbandingan Java String dengan metode equals Sebagian besar waktu (mungkin 95% dari waktu) Saya membandingkan string dengan metode equals dari kelas Java String, seperti ini:
Metode String sama dengan ini melihat dua string Java, dan jika mereka berisi string karakter yang sama persis, mereka dianggap sama.
Melihat contoh perbandingan String cepat dengan metode equals, jika tes berikut dijalankan, dua string tidak akan dianggap sama karena karakternya tidak persis sama (kasus karakter berbeda):
Tetapi, ketika dua string berisi string karakter yang sama persis, metode equals akan mengembalikan true, seperti dalam contoh ini:
Opsi 2: Perbandingan string dengan metode equalsIgnoreCase
Dalam beberapa tes perbandingan string, Anda ingin mengabaikan apakah string dalam huruf besar atau kecil. Saat Anda ingin menguji string Anda untuk kesetaraan dengan cara case-insensitive ini, gunakan metode equalsIgnoreCase dari kelas String, seperti ini:
Opsi 3: Perbandingan Java String dengan metode compareTo
Ada juga yang ketiga, cara yang kurang umum untuk membandingkan string Java, dan itu dengan metode StringTemper banding kelas. Jika dua string persis sama, metode compareTo akan mengembalikan nilai 0 (nol). Berikut adalah contoh singkat dari apa yang tampak seperti pendekatan perbandingan String ini:
Sementara saya sedang menulis tentang konsep persamaan di Jawa, penting untuk dicatat bahwa bahasa Jawa mencakup metode yang sama dengan di kelas dasar Java Object. Setiap kali Anda membuat objek Anda sendiri dan Anda ingin memberikan cara untuk melihat apakah dua instance objek Anda "sama", Anda harus menimpa (dan mengimplementasikan) metode yang sama dengan ini di kelas Anda (dengan cara yang sama bahasa Java menyediakan perilaku persamaan / perbandingan ini dalam metode String sama dengan).
Anda mungkin ingin melihat ini ==, .equals (), compareTo (), dan bandingkan ()
sumber
Fungsi:
Uji:
sumber
==
danequals
sudah dijawab oleh solusi lain, saya hanya menawarkan cara berbeda untuk membandingkan string dengan cara yang longgarThe
==
cek Operator jika dua referensi menunjuk ke objek yang sama atau tidak..equals()
periksa konten string yang sebenarnya (nilai).Perhatikan bahwa
.equals()
metode ini milik kelasObject
(kelas super semua kelas). Anda perlu menimpanya sesuai kebutuhan kelas Anda, tetapi untuk String sudah diterapkan, dan memeriksa apakah dua string memiliki nilai yang sama atau tidak.Kasus 1
Alasan: String literal yang dibuat tanpa null disimpan di kumpulan String di area permgen heap. Jadi titik s1 dan s2 baik untuk objek yang sama di kolam renang.
Kasus 2
Alasan: Jika Anda membuat objek String menggunakan
new
kata kunci, ruang terpisah dialokasikan untuk itu di heap.sumber
==
membandingkan nilai referensi objek sedangkanequals()
metode yang ada dijava.lang.String
kelas membandingkan kontenString
objek (dengan objek lain).sumber
equals()
metode untukString
sebenarnya diString
kelas, bukan diObject
. Defaultequals()
diObject
tidak akan membandingkan bahwa isinya sama, dan pada kenyataannya hanya mengembalikan true ketika referensi sama.Saya pikir ketika Anda mendefinisikan
String
Anda mendefinisikan sebuah objek. Jadi, Anda perlu menggunakan.equals()
. Saat Anda menggunakan tipe data primitif yang Anda gunakan==
tetapi denganString
(dan objek apa pun) yang harus Anda gunakan.equals()
.sumber
Jika
equals()
metode hadir dijava.lang.Object
kelas, dan diharapkan untuk memeriksa kesetaraan keadaan objek! Itu artinya, isi benda. Sedangkan==
operator diharapkan memeriksa instance objek yang sebenarnya sama atau tidak.Contoh
Pertimbangkan dua variabel referensi yang berbeda,
str1
danstr2
:Jika Anda menggunakan
equals()
Anda akan mendapatkan output seperti
TRUE
jika Anda gunakan==
.Sekarang Anda akan mendapatkan
FALSE
output sebagai, karena keduanyastr1
danstr2
menunjuk ke dua objek yang berbeda walaupun keduanya berbagi konten string yang sama. Itu karenanew String()
objek baru dibuat setiap saat.sumber
Operator == selalu dimaksudkan untuk perbandingan referensi objek , sedangkan metode kelas String .equals () diganti untuk perbandingan konten :
sumber
Semua objek dijamin memiliki
.equals()
metode karena Objek berisi metode.equals()
,, yang mengembalikan boolean. Adalah tugas subclass untuk menimpa metode ini jika definisi definisi lebih lanjut diperlukan. Tanpa itu (yaitu menggunakan==
) hanya alamat memori yang diperiksa antara dua objek untuk kesetaraan. String menimpa.equals()
metode ini dan alih-alih menggunakan alamat memori, String mengembalikan perbandingan string pada level karakter untuk kesetaraan.Catatan utama adalah bahwa string disimpan dalam satu kumpulan benjolan sehingga setelah sebuah string dibuat, string tersebut selamanya disimpan dalam sebuah program di alamat yang sama. String tidak berubah, mereka tidak berubah. Inilah sebabnya mengapa itu adalah ide yang buruk untuk menggunakan penggabungan string biasa jika Anda memiliki jumlah serius pemrosesan string yang harus dilakukan. Sebagai gantinya Anda akan menggunakan
StringBuilder
kelas yang disediakan. Ingat pointer ke string ini dapat berubah dan jika Anda tertarik untuk melihat apakah dua pointer itu sama==
akan menjadi cara yang baik untuk pergi. String sendiri tidak.sumber
final String
variabel) dan string yang program Anda secara magang disimpan dalam apa yang Anda sebut "kumpulan benjolan". SemuaString
objek lain tunduk pada pengumpulan sampah begitu tidak ada lagi referensi langsung ke mereka, sama seperti jenis objek lainnya. Selain itu, sementara ketidakmampuan diperlukan untuk keseluruhan mekanisme magang untuk bekerja, itu tidak relevan dengan ini.Anda juga dapat menggunakan
compareTo()
metode ini untuk membandingkan dua String. Jika hasil compareTo adalah 0, maka kedua string sama, jika tidak, string yang dibandingkan tidak sama.Yang
==
membandingkan referensi dan tidak membandingkan string yang sebenarnya. Jika Anda memang membuat setiap string menggunakannew String(somestring).intern()
maka Anda dapat menggunakan==
operator untuk membandingkan dua string, jika tidak sama dengan () atau metode compareTo hanya dapat digunakan.sumber
Di Jawa, ketika operator “==” digunakan untuk membandingkan 2 objek, ia memeriksa untuk melihat apakah objek merujuk ke tempat yang sama di memori. Dengan kata lain, itu memeriksa untuk melihat apakah 2 nama objek pada dasarnya referensi ke lokasi memori yang sama.
Kelas Java String benar-benar menimpa implementasi default equals () di kelas Object - dan itu menimpa metode sehingga hanya memeriksa nilai-nilai string, bukan lokasi mereka di memori. Ini berarti bahwa jika Anda memanggil metode equals () untuk membandingkan 2 objek String, maka selama urutan karakter sebenarnya sama, kedua objek dianggap sama.
sumber