Apa perbedaan antara String#equals
metode dan String#contentEquals
metode ini?
152
Apa perbedaan antara String#equals
metode dan String#contentEquals
metode ini?
Tidak String#equals()
hanya membandingkan isi String, tetapi juga memeriksa apakah objek lain juga merupakan instance dari a String
. The String#contentEquals()
hanya membandingkan isi (urutan karakter) dan tidak tidak memeriksa apakah benda lain juga merupakan contoh dari String
. Itu bisa apa saja asalkan merupakan implementasi dari CharSequence
yang mencakup ao String
, StringBuilder
, StringBuffer
, CharBuffer
, dll
==
(contentEquals) dan===
(equals) dalam javascript?==
operator hanya akan mengizinkan Anda membandingkan referensi, bukan konten dari dua objek.==
disebutkan hanyalah JavaScript; tidak pernah disebutkan tentang Java.==
dalam JavaScript jauh lebih longgar daripadacontentEquals
, yang tidak akan menyentuh angka, misalnya), tetapi Anda benar tentangequals
memeriksa kecocokan jenis yang tepat denganStrings
(kelas lain mungkin lebih longgar dengan jenis dalamequals
metode mereka ) .Sederhananya:
String.contentEquals()
adalah saudara yang lebih pintarString.equals()
, karena bisa lebih bebas dalam implementasi daripadaString.equals()
.Ada beberapa alasan mengapa ada
String.contentEquals()
metode terpisah . Alasan terpenting yang saya pikirkan adalah:equals
Metode harus refleksif. Itu berarti bahwa:x.equals(y) == y.equals(x)
. Ini berarti bahwaaString.equals(aStringBuffer)
harus sama denganaStringBuffer.equals(aString)
. Ini akan membutuhkan pengembang Java API untuk membuat beberapa implementasi khusus untuk Strings dalamequals()
metode StringBuffer, StringBuilder dan CharSequence juga. Ini akan berantakan.Di sinilah
String.contentEquals
masuk. Ini adalah metode mandiri yang tidak tidak harus mengikuti persyaratan yang ketat dan aturan untukObject.equals
. Dengan cara ini, Anda dapat menerapkan rasa "konten yang sama" lebih bebas. Ini memungkinkan Anda untuk membuat perbandingan cerdas antara StringBuffer dan String, misalnya.Dan untuk mengatakan apa sebenarnya perbedaannya adalah:
String.contentEquals()
dapat membandingkan konten dari aString
, aStringBuilder
, aStringBuffer
, a,CharSequence
dan semua kelas turunannya. Jika parameternya bertipe String, makaString.equals()
jalankan.String.equals()
hanya membandingkan objek String. Semua jenis objek lainnya dianggap tidak sama.String.contentEquals()
dapat membandingkanStringBuffer
danStringBuilder
dengan cara yang cerdas. Itu tidak memanggiltoString()
metode berat , yang menyalin seluruh konten ke objek String baru. Sebaliknya, ia membandingkan denganchar[]
array yang mendasarinya , yang sangat bagus.sumber
Jawaban ini sudah diposting oleh dbw tetapi dia menghapusnya tetapi dia memiliki beberapa poin yang sangat valid untuk perbedaan sambil membandingkan waktu eksekusi, pengecualian apa yang dilemparkan,
Jika Anda melihat kode sumber String # equals dan String # contentEquals jelas bahwa ada dua metode yang diganti untuk
String#contentEquals
satu yang mengambilStringBuilder
dan yang lainnyaCharSequence
.Perbedaan di antara mereka,
String#contentEquals
akan melempar NPE jika argumen yang diberikan adalahnull
tetapiString#equals
akan kembalifalse
String#equals
membandingkan konten hanya ketika argumen yang diberikan adalahinstance of String
sebaliknya akan kembalifalse
dalam semua kasus lain tetapi di sisi lainString#contentEquals
memeriksa konten semua objek yang mengimplementasikan antarmukaCharSequence
.Anda juga dapat mengubah kode sehingga
String#contentEquals
mengembalikan hasil atau hasil yang salah yang Anda inginkan denganequals
mengganti metode argumen yang diteruskan seperti yang ditunjukkan di bawah ini tetapi Anda tidak dapat melakukan tweak denganString#equals
.Kode di bawah ini akan selalu menghasilkan
true
selamas
berisistring
yang panjangnya 3 karakterString#contentEquals
akan lebih lambat makaString#Equals
dalam kasus ketika argumen yang diberikan adalahinstance of String
dan panjang keduanyaString
sama tetapi isinya tidak sama.Contoh jika string
String s = "madam"
danString argPassed = "madan"
kemudians.contentEquals(argPassed)
akan memakan waktu hampir dua kali lipat waktu eksekusi dalam kasus ini dibandingkan dengans.equals(argPassed)
Jika panjang konten tidak sama untuk kedua string maka fungsinya
String#contentEquals
akan memiliki kinerja yang lebih baik makaString#Equals
dalam hampir semua kasus mungkin.Satu hal lagi untuk menambah jawabannya
String#contentEquals
suatuString
objek juga akan membandingkan denganStringBuilder
konten dan memberikan hasil yang sesuai saatString#Equals
akan kembalifalse
sumber
String
equals(Object o)
metode kelas hanya melakukanString
perbandingan. TetapicontentEquals(CharSequence cs)
pemeriksaan untuk kelas mencakupAbstractStringBuilder
ieStringBuffer
,StringBuilder
danString
juga kelas (Mereka semua bertipeCharSequence
).keluaran:
Output dari stmt pertama adalah
false
karenabuilder
bukan tipeString
begituequals()
kembalifalse
tetapicontentEquals()
pemeriksaan atas isi dari semua jenis sepertiStringBuilder
,StringBuffer
,String
dan dengan konten yang sama makatrue
.contentEquals
akan melemparNullPointerException
jika argumen yang diberikan adalahnull
tetapiequals()
akan mengembalikan false karena equals () memeriksa instanceOf (if (anObject instance of String)
) yang mengembalikan false jika argumen tersebutnull
.sumber
contentEquals(CharSequence cs)
:java.lang.CharacterSequence
(misalnya,CharBuffer
,Segment
,String
,StringBuffer
,StringBuilder
)equals(Object anObject)
:java.lang.String
sajaRTFC :)
Karena membaca sumber adalah cara terbaik untuk memahaminya, saya membagikan implementasi dari kedua metode (pada jdk 1.7.0_45)
Ada metode lain dari String # contentEquals ():
sumber
equals()
dancontentEquals()
dua metode diString
kelas untuk membandingkan duastrings
danstring
denganStringBuffer
.Parameter
contentEquals()
areStringBuffer
danString(charSequence)
.equals()
digunakan untuk membandingkan duastrings
dancontentEquals()
digunakan untuk membandingkan kontenString
danStringBuffer
.Metode
contentEquals
danequals
yangBerikut adalah kode yang menjelaskan kedua metode tersebut
Keluaran:
sumber
String # equals mengambil Object sebagai argumen dan memeriksa apakah instance dari objek String atau tidak. Jika objek argumen adalah Objek String maka ia membandingkan konten karakter dengan karakter. Ini mengembalikan true jika konten dari kedua objek string sama.
String # contentEquals mengambil antarmuka CharSequence sebagai argumen. CharSequence dapat diimplementasikan dalam 2 cara-dengan menggunakan i) kelas String atau (ii) AbstractStringBuilder (kelas induk dari StringBuffer, StringBuilder)
Dalam contentEquals () panjang dibandingkan sebelum pemeriksaan instance objek. Jika panjangnya sama maka ia memeriksa objek argumen adalah instance dari AbstractStringBuilder atau tidak. Jika demikian (mis. StringBuffer atau StringBuilder) maka konten diperiksa karakter demi karakter. Dalam kasus argumen adalah turunan dari objek String maka String # sama dengan dipanggil dari String # contentEquals.
Singkatnya,
String # sama dengan membandingkan karakter konten dengan karakter dalam argumen kasus adalah objek String juga. Dan String # contentEquals membandingkan konten jika objek argumen mengimplementasikan antarmuka CharSequence.
String # contentEquals lebih lambat jika kita membandingkan dua konten string panjang yang sama dengan String # contentEquals secara internal memanggil String # sama dengan untuk objek String.
Jika kita mencoba membandingkan objek dengan panjang konten yang berbeda (katakan "abc" dengan "abcd") maka String # contentEquals lebih cepat daripada String # equals. Karena panjang dibandingkan sebelum objek misalnya memeriksa.
sumber
The
contentEquals()
Metode pemeriksaan adalah isinya sama antaraString
,StringBuffer
, dll yang semacam urutan arang.sumber
BTW, alasan historis untuk perbedaan adalah bahwa String awalnya tidak memiliki superclass, jadi String.equals () mengambil String sebagai argumennya. Ketika CharSequence diperkenalkan sebagai superclass of String, ia membutuhkan tes kesetaraan sendiri yang bekerja di semua implementasi CharSequence, dan yang tidak akan bertabrakan dengan equals () yang sudah digunakan oleh String ... jadi kami mendapat CharSequence.contentEquals ( ), yang diwarisi oleh String.
Jika CharSequence telah ada di Java 1.0, kami mungkin hanya memiliki CharSequence.equals () dan String hanya akan mengimplementasikannya.
Ah, kegembiraan bahasa yang berkembang ...
sumber