Saat menguji persamaan String
di Jawa, saya selalu menggunakan equals()
karena bagi saya ini sepertinya metode paling alami untuk itu. Bagaimanapun, namanya sudah mengatakan apa yang akan dilakukannya. Namun, seorang kolega saya baru-baru ini memberi tahu saya telah diajari untuk menggunakan, compareTo() == 0
bukan equals()
. Ini terasa tidak wajar (seperti compareTo()
yang dimaksudkan untuk memberikan tatanan dan tidak membandingkan kesetaraan) dan bahkan agak berbahaya (karena compareTo() == 0
tidak selalu berarti kesetaraan dalam semua kasus, meskipun saya tahu itu untuk String
) bagi saya.
Dia tidak tahu mengapa dia diajari untuk menggunakan compareTo()
daripada equals()
untuk String
, dan saya juga tidak dapat menemukan alasan mengapa. Apakah ini benar-benar masalah selera pribadi, atau adakah alasan nyata untuk kedua metode tersebut?
.equalsIgnoreCase()
adalah perbandingan tercepat jika memang sesuai, jika.equals()
tidak itulah yang Anda inginkan.compareTo() == 0
tidak selalu berarti kesetaraan dalam semua kasus". Ini sangat benar! Persis seperti inilah arti frasa "konsisten dengan sama" dalam spesifikasi Java API, misalnya dalam spesifikasi kelas yang sebanding . Misalnya, metode perbandingan String konsisten dengan sama, tetapi metode perbandingan BigDecimal tidak konsisten dengan sama.Jawaban:
Perbedaannya adalah bahwa
"foo".equals((String)null)
mengembalikan nilai salah saat"foo".compareTo((String)null) == 0
melontarkan NullPointerException. Jadi mereka tidak selalu dapat dipertukarkan bahkan untuk String.sumber
2 perbedaan utamanya adalah:
equals
akan mengambil Objek sebagai parameter, tetapicompareTo
hanya akan mengambil String.equals
hanya memberi tahu Anda apakah keduanya sama atau tidak, tetapicompareTo
memberikan informasi tentang bagaimana String dibandingkan secara leksikografis.Saya melihat kode kelas String , dan algoritme di dalam bandingkanTo dan sama dengan pada dasarnya terlihat sama. Saya percaya pendapatnya hanya masalah selera, dan saya setuju dengan Anda - jika yang perlu Anda ketahui hanyalah persamaan String dan bukan yang mana yang lebih dulu secara leksikografis, maka saya akan menggunakan
equals
.sumber
Saat membandingkan kesetaraan, Anda harus menggunakan
equals()
, karena ini mengungkapkan maksud Anda dengan cara yang jelas.compareTo()
memiliki kelemahan tambahan yaitu hanya bekerja pada objek yang mengimplementasikanComparable
antarmuka.Ini berlaku secara umum, tidak hanya untuk String.
sumber
compareTo
telah melakukan lebih banyak pekerjaan jika string memiliki panjang yang berbeda.equals
dapat kembali salah, sementaracompareTo
harus selalu memeriksa karakter yang cukup untuk menemukan urutan penyortiran.sumber
compareTo()
tidak hanya berlaku untuk String tetapi juga objek lain karenacompareTo<T>
mengambil argumen umumT
. String adalah salah satu kelas yang telah mengimplementasikancompareTo()
metode dengan mengimplementasikanComparable
antarmuka. (bandingkanTo () adalah metode untuk Antarmuka yang sebanding). Jadi setiap kelas bebas mengimplementasikan antarmuka Comparable.Tetapi
compareTo()
memberikan urutan objek , biasanya digunakan dalam mengurutkan objek dalam urutan naik atau turun sementaraequals()
hanya akan berbicara tentang persamaan dan mengatakan apakah mereka sama atau tidak.sumber
Dalam Konteks String:
bandingkanTo: Membandingkan dua string secara leksikografis.
sama dengan: Membandingkan string ini dengan objek yang ditentukan.
bandingkanTo membandingkan dua string dengan karakternya (pada indeks yang sama) dan mengembalikan integer (positif atau negatif) yang sesuai.
sumber
Perbedaan yang sangat penting antara bandingkanTo dan sama dengan:
equals () memeriksa apakah dua objek sama atau tidak dan mengembalikan boolean.
bandingkanTo () (dari interface Comparable) mengembalikan integer. Ia memeriksa mana dari dua objek yang "kurang dari", "sama dengan" atau "lebih besar dari" yang lain. Tidak semua objek bisa diurutkan secara logis, jadi metode bandingkanTo () tidak selalu masuk akal.
Perhatikan bahwa equals () tidak mendefinisikan pengurutan antar objek, seperti yang dilakukan oleh bandingkanTo ().
Sekarang saya menyarankan Anda untuk meninjau kode sumber dari kedua metode untuk menyimpulkan bahwa yang sama lebih disukai daripada bandingkan yang melibatkan beberapa perhitungan Matematika.
sumber
Tampaknya kedua metode cukup banyak melakukan hal yang sama, tetapi metode bandingkanTo () mengambil String, bukan Objek, dan menambahkan beberapa fungsionalitas tambahan di atas metode equals () normal. Jika yang Anda pedulikan hanyalah persamaan, maka metode equals () adalah pilihan terbaik, karena lebih masuk akal bagi programmer berikutnya yang melihat kode Anda. Perbedaan waktu antara dua fungsi berbeda seharusnya tidak menjadi masalah kecuali Anda mengulang beberapa item dalam jumlah besar. CompareTo () sangat berguna ketika Anda perlu mengetahui urutan String dalam sebuah koleksi atau ketika Anda perlu mengetahui perbedaan panjang antara string yang dimulai dengan urutan karakter yang sama.
sumber: http://java.sun.com/javase/6/docs/api/java/lang/String.html
sumber
equals()
harus menjadi metode pilihan dalam kasus OP.Melihat implementasi
equals()
dancompareTo()
di java.lang.String pada grepcode , kita dapat dengan mudah melihat bahwa persamaan lebih baik jika kita hanya mementingkan persamaan dua String:equals()
:dan
compareTo()
:Ketika salah satu string adalah awalan dari string lain, kinerja dari
compareTo()
lebih buruk karena masih perlu menentukan urutan leksikografis sementaraequals()
tidak perlu khawatir lagi dan segera mengembalikan salah.Menurut pendapat saya, kita harus menggunakan keduanya sebagaimana mestinya:
equals()
untuk memeriksa kesetaraan, dancompareTo()
untuk menemukan urutan leksikal.sumber
equals () memeriksa apakah dua string sama atau tidak. Ini memberikan nilai boolean. bandingkanTo () memeriksa apakah objek string sama dengan, lebih besar atau lebih kecil dari objek string lainnya, memberikan hasil sebagai: 1 jika objek string lebih besar 0 jika keduanya sama -1 jika string lebih kecil dari string lain
persamaan:
sumber
Ada hal-hal tertentu yang perlu Anda ingat saat mengganti CompareTo di Java, misalnya Compareto harus konsisten dengan sama dan pengurangan tidak boleh digunakan untuk membandingkan bidang integer karena dapat meluap. centang Hal-hal yang perlu diingat saat mengganti Pembanding di Java untuk detailnya.
sumber
Ini adalah percobaan di necromancy :-)
Sebagian besar jawaban membandingkan kinerja dan perbedaan API. Mereka kehilangan poin fundamental bahwa kedua operasi tersebut memiliki semantik yang berbeda.
Intuisi Anda benar. x.equals (y) tidak dapat dipertukarkan dengan x.compareTo (y) == 0. Yang pertama membandingkan identitas, sedangkan yang lain membandingkan pengertian 'size'. Memang benar bahwa dalam banyak kasus, terutama dengan tipe primitif, kedua hal ini sejajar.
Kasus umumnya adalah ini:
Jika x dan y identik, mereka berbagi 'ukuran' yang sama: jika x.equals (y) adalah benar => x.compareTo (y) adalah 0.
Namun, jika x dan y memiliki ukuran yang sama, bukan berarti keduanya identik.
jika x.compareTo (y) adalah 0 tidak selalu berarti x.equals (y) benar.
Contoh menarik di mana identitas berbeda dari ukuran adalah bilangan kompleks. Asumsikan bahwa perbandingan dilakukan dengan nilai absolutnya. Jadi diberikan dua bilangan kompleks: Z1 = a1 + b1 * i dan Z2 = a2 + b2 * i:
Z1.equals (z2) mengembalikan nilai true jika dan hanya jika a1 = a2 dan b1 = b2.
Namun Z1.compareTo (Z2) mengembalikan 0 untuk dan jumlah tak terbatas dari pasangan (a1, b1) dan (a2, b2) asalkan memenuhi kondisi a1 ^ 2 + b1 ^ 2 == a2 ^ 2 + b2 ^ 2.
sumber
Hasil yang sama bisa lebih efisien daripada bandingkan
Jika panjang urutan karakter dalam String tidak cocok, tidak mungkin String sama sehingga penolakan bisa lebih cepat.
Apalagi jika itu objek yang sama (persamaan identitas daripada persamaan logis), itu juga akan lebih efisien.
Jika mereka juga menerapkan cache hashCode, bisa jadi lebih cepat untuk menolak yang tidak sama jika kode hash mereka tidak cocok.
sumber
String.equals()
membutuhkaninstanceof
operator memanggil sementaracompareTo()
tidak membutuhkan. Rekan saya telah mencatat penurunan kinerja besar yang disebabkan oleh jumlahinstanceof
panggilan yang berlebihan dalamequals()
metode, namun pengujian saya terbukticompareTo()
hanya sedikit lebih cepat.Saya menggunakan, bagaimanapun, Java 1.6. Pada versi lain (atau vendor JDK lainnya) perbedaannya bisa lebih besar.
Pengujian tersebut membandingkan setiap string dalam 1000 array elemen, diulangi 10 kali.
sumber
compareTo()
lebih cepat daripadaequals()
? Tetapi untuk sebagian besar kumpulan data dunia nyataequals()
jauh lebih cepat daripadacompareTo() == 0
.equals()
bersinar jika string memiliki awalan yang sama tetapi panjangnya berbeda atau jika sebenarnya adalah objek yang sama.equals
dapat menggunakan Objek apa pun sebagai parameter, tetapicompareTo
hanya dapat menggunakan String.ketika cometo null,
compareTo
akan mengeluarkan pengecualianketika Anda ingin mengetahui di mana perbedaan itu terjadi, Anda dapat menggunakan
compareTo
.sumber
equals
: diperlukan untuk memeriksa kesetaraan dan membatasi duplikat. Banyak kelas Pustaka Java menggunakan ini jika mereka ingin menemukan duplikat. misalnyaHashSet.add(ob1)
hanya akan menambah jika itu tidak ada. Jadi jika Anda memperluas beberapa kelas seperti ini, timpaequals()
.compareTo
: diperlukan untuk memesan elemen. Sekali lagi untuk penyortiran stabil Anda memerlukan persamaan, jadi ada pengembalian 0.sumber
Sama dengan -
1- Timpa metode GetHashCode untuk memungkinkan suatu tipe bekerja dengan benar dalam tabel hash.
2- Jangan melempar pengecualian dalam penerapan metode Setara. Sebagai gantinya, kembalikan false untuk argumen nol.
3-
Pemanggilan x.Equals (y) berturut-turut mengembalikan nilai yang sama selama objek yang direferensikan oleh x dan y tidak dimodifikasi.
4- Untuk beberapa jenis objek, sebaiknya uji Persamaan untuk persamaan nilai daripada persamaan referensial. Implementasi Equals seperti itu mengembalikan nilai true jika dua objek memiliki nilai yang sama, meskipun keduanya bukan instance yang sama.
Sebagai contoh -
Keluaran: -
sementara bandingkanTo -
Membandingkan instance saat ini dengan objek lain berjenis sama dan mengembalikan integer yang menunjukkan apakah instance saat ini mendahului, mengikuti, atau terjadi pada posisi yang sama dalam urutan seperti objek lainnya.
Ia kembali -
Kurang dari nol - Contoh ini mendahului obj dalam urutan urutan. Nol - Contoh ini terjadi pada posisi yang sama dalam urutan seperti obj. Lebih besar dari nol - Contoh ini mengikuti obj dalam urutan pengurutan.
ArgumentException bisa muncul jika objek tidak berjenis sama dengan instance.
Misalnya Anda bisa berkunjung ke sini.
Jadi saya menyarankan lebih baik untuk menggunakan Equals sebagai pengganti bandingkanTo.
sumber
GetHashCode()
metode. Apakah yang Anda maksudhashCode()
?"sama dengan" membandingkan objek dan mengembalikan benar atau salah dan "bandingkan dengan" mengembalikan 0 jika benar atau angka [> 0] atau [<0] jika salah di sini contohnya:
Hasil:
Dokumentasi Dibandingkan dengan: https://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html
Dokumentasi Sama Dengan: https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals(java.lang.Object)
sumber
Di sini satu hal penting saat menggunakan
compareTo()
overequals()
yangcompareTo
berfungsi untuk kelas yang mengimplementasikan antarmuka 'Comparable' jika tidak maka akan memunculkan fileNullPointerException
.String
class mengimplementasikan antarmuka Comparable sementaraStringBuffer
tidak maka Anda dapat menggunakan"foo".compareTo("doo")
diString
objek tetapi tidak diStringBuffer
Object.sumber
Ini mencetak -2 dan salah
Ini mencetak 2 dan salah
Ini mencetak 0 dan benar
sama dengan mengembalikan boolean jika dan hanya jika kedua string cocok.
bandingkanTo dimaksudkan tidak hanya untuk mengetahui apakah keduanya cocok tetapi juga untuk mengetahui String mana yang lebih rendah dari yang lain, dan juga seberapa banyak, secara leksikografis. Ini sebagian besar digunakan saat menyortir dalam koleksi.
sumber
Saya percaya
equals
danequalsIgnoreCase
metodeString
pengembaliantrue
danfalse
yang berguna jika Anda ingin membandingkan nilai objek string, Tetapi dalam kasus penerapancompareTo
dancompareToIgnoreCase
metode mengembalikan nilai positif, negatif dan nol yang akan berguna dalam kasus penyortiran.sumber