Saya ingin mengklarifikasi jika saya memahami ini dengan benar:
==
adalah perbandingan referensi, yaitu kedua objek menunjuk ke lokasi memori yang sama.equals()
mengevaluasi perbandingan nilai dalam objek
java
identity
equality
object-comparison
brainydexter
sumber
sumber
.equals()
dianggap setara secara bermaknaJawaban:
Secara umum, jawaban untuk pertanyaan Anda adalah "ya", tetapi ...
.equals(...)
hanya akan membandingkan apa yang ditulis untuk membandingkan, tidak lebih, tidak kurang.equals(Object o)
metode kelas induk terdekat yang telah menimpa metode ini.Object#equals(Object o)
metode tersebut. Per Object API ini sama dengan==
; yaitu, mengembalikan true jika dan hanya jika kedua variabel merujuk ke objek yang sama, jika referensi mereka adalah satu dan sama. Dengan demikian Anda akan menguji kesetaraan objek dan bukan kesetaraan fungsional .hashCode
jika Anda menggantiequals
agar tidak "melanggar kontrak". Sesuai API, hasil yang dikembalikan darihashCode()
metode untuk dua objek harus sama jikaequals
metode mereka menunjukkan bahwa mereka setara. Kebalikannya belum tentu benar.sumber
==
memeriksa referensi memori lalu mengapa saya mendapatkan perilaku aneh ini di [ini] [1] [1]: docs.google.com/document/d/... Saya berharap hasilnya benar. dapat menghapus kebingungan sayaThe equals method for class Object implements the most discriminating possible equivalence relation on objects; that is, for any non-null reference values x and y, this method returns true if and only if x and y refer to the same object (x == y has the value true).
<br/>Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.
( docs.oracle.com/javase/7/docs/api/java/lang/… )Sehubungan dengan kelas String:
Equals () metode membandingkan "nilai" dalam contoh String (di heap) terlepas jika dua referensi objek mengacu String contoh yang sama atau tidak. Jika ada dua objek referensi dari tipe String merujuk ke instance String yang sama maka hebat! Jika dua referensi objek merujuk pada dua instance String yang berbeda .. itu tidak membuat perbedaan. Ini adalah "nilai" (yaitu: isi dari array karakter) di dalam setiap instance String yang sedang dibandingkan.
Di sisi lain, operator "==" membandingkan nilai dua referensi objek untuk melihat apakah mereka merujuk ke instance String yang sama . Jika nilai kedua referensi objek "merujuk ke" contoh String yang sama maka hasil dari ekspresi boolean akan menjadi "benar" .. ya. Jika, di sisi lain, nilai dari kedua referensi objek "merujuk ke" instance String yang berbeda (meskipun kedua instance String memiliki "nilai" yang identik, yaitu, isi array karakter dari setiap instance String adalah sama) hasil dari ekspresi boolean akan menjadi "salah".
Seperti halnya penjelasan apa pun, biarkan masuk.
Saya harap ini membersihkan sedikit.
sumber
String
s,==
adalah referensi sama juga, ya, tapi itu biasanya bekerja (seperti dalam duaString
s dengan konten yang sama akan biasanya menjadi==
satu sama lain), karena bagaimana menangani JavaString
s. Ini tidak akan selalu, dan itu tentu praktik yang buruk, tetapi itu adalah kesalahan umum, terutama dari orang-orang yang datang dari bahasa lain.String
build from string literal akan ditambahkan ke sesuatu yang disebutString constant pool
, misalString s1 = "someString"; String s2 = "someString;"
keduanyas1
&s2
akan berbagi referensi yang sama.s1 == s2
akan mengembalikan true. Tetapi jika mereka dibangun melaluiString constructor
, misalnyaString s1 = new String("someString"); String s2 = new String("someString");
maka mereka tidak akan berbagi referensi yang sama.s1 == s2
akan kembali salah.Ada beberapa perbedaan kecil tergantung apakah Anda berbicara tentang "primitif" atau "Jenis Objek"; hal yang sama dapat dikatakan jika Anda berbicara tentang anggota "statis" atau "non-statis"; Anda juga dapat mencampur semua hal di atas ...
Berikut ini sebuah contoh (Anda dapat menjalankannya):
Anda dapat membandingkan penjelasan untuk "==" (Operator Kesetaraan) dan ".equals (...)" (metode di kelas java.lang.Object) melalui tautan ini:
sumber
Perbedaan antara == dan yang sama membingungkan saya untuk beberapa saat sampai saya memutuskan untuk melihatnya lebih dekat. Banyak dari mereka mengatakan bahwa untuk membandingkan string yang harus Anda gunakan
equals
dan tidak==
. Semoga dalam jawaban ini saya akan bisa mengatakan perbedaannya.Cara terbaik untuk menjawab pertanyaan ini adalah dengan mengajukan beberapa pertanyaan kepada diri Anda sendiri. jadi ayo mulai:
Apa output untuk program di bawah ini:
jika Anda mengatakan,
Saya akan mengatakan Anda benar tetapi mengapa Anda mengatakan itu ? dan Jika Anda mengatakan outputnya adalah,
Saya akan mengatakan Anda salah tetapi saya masih akan bertanya, mengapa Anda berpikir itu benar?
Ok, mari kita coba jawab yang ini:
Apa output untuk program di bawah ini:
Sekarang, jika Anda berkata,
Saya akan mengatakan Anda salah, tetapi mengapa sekarang salah ? output yang benar untuk program ini adalah
Silakan bandingkan program di atas dan coba pikirkan.
Baik. Sekarang ini mungkin membantu (harap baca ini: cetak alamat objek - tidak mungkin tetapi kita masih bisa menggunakannya.)
dapatkah Anda mencoba memikirkan output dari tiga baris terakhir dalam kode di atas: untuk saya ideone mencetaknya ( Anda dapat memeriksa kode di sini ):
Oh! Sekarang Anda melihat identityHashCode (mangga) sama dengan identityHashCode (mangga2) Tapi itu tidak sama dengan identityHashCode (mangga3)
Meskipun semua variabel string - mangga, mangga 2 dan mangga 3 - memiliki nilai yang sama , yaitu "mangga",
identityHashCode()
masih belum sama untuk semua.Sekarang coba batalkan komentar pada baris ini
// mango2 = "mang";
dan jalankan lagi kali ini Anda akan melihat ketiganyaidentityHashCode()
berbeda. Hmm itu petunjuk yang bermanfaatkita tahu bahwa jika
hashcode(x)=N
danhashcode(y)=N
=>x is equal to y
Saya tidak yakin bagaimana java bekerja secara internal tetapi saya menganggap ini adalah apa yang terjadi ketika saya berkata:
java membuat string
"mango"
yang ditunjuk (direferensikan) oleh variabelmango
seperti iniSekarang di baris berikutnya ketika saya berkata:
Ini benar-benar menggunakan kembali string
"mango"
yang sama yang terlihat seperti iniBaik mangga dan mangga menunjuk ke referensi yang sama Sekarang ketika saya berkata
Ini sebenarnya menciptakan referensi (string) yang sama sekali baru untuk "mangga". yang terlihat seperti ini,
dan itulah sebabnya ketika saya mengeluarkan nilai-nilai untuk
mango == mango2
, itu dikeluarkantrue
. dan ketika saya mengeluarkan nilai untukmango3 == mango2
, itu mengeluarkanfalse
(bahkan ketika nilainya sama).dan ketika Anda membatalkan komentar baris
// mango2 = "mang";
itu benar-benar menciptakan string "mang" yang mengubah grafik kita seperti ini:Inilah sebabnya mengapa identityHashCode tidak sama untuk semua.
Semoga ini bisa membantu kalian. Sebenarnya, saya ingin membuat test case di mana == gagal dan sama dengan () lulus. Silakan berkomentar dan beri tahu saya jika saya salah.
sumber
mango == mango2
terjadi karena Anda tidak membuatmango2
objek String baru, dan alih-alih langsung direferensikan"mango"
?Bersulang :-)
sumber
Anda harus mengganti fungsi equals (bersama dengan yang lain) untuk menggunakan ini dengan kelas kustom.
Metode equals membandingkan objek.
The
==
operator biner membandingkan alamat memori.sumber
Baik == dan .equals () merujuk ke objek yang sama jika Anda tidak menimpa .equals ().
Ini keinginan Anda apa yang ingin Anda lakukan setelah Anda menimpa .equals (). Anda dapat membandingkan status objek pemanggilan dengan status objek yang diteruskan atau Anda bisa memanggil super.equals ()
sumber
==
adalah operator danequals()
merupakan metode .Operator umumnya digunakan untuk perbandingan tipe primitif dan dengan demikian
==
digunakan untuk perbandingan alamat memori danequals()
metode digunakan untuk membandingkan objek .sumber
sumber
Ingatlah bahwa
.equals(...)
itu harus diimplementasikan oleh kelas yang Anda coba bandingkan. Kalau tidak, tidak ada gunanya; versi metode untuk kelas Object melakukan hal yang sama dengan operasi perbandingan: Object # equals .Satu-satunya waktu Anda benar-benar ingin menggunakan operator pembanding untuk objek adalah ketika Anda membandingkan Enums. Ini karena hanya ada satu instance dari nilai Enum pada suatu waktu. Misalnya, diberi enum
Anda tidak akan pernah memiliki lebih dari satu contoh
A
sekaligus, dan hal yang sama untukB
danC
. Ini berarti Anda benar-benar dapat menulis metode seperti ini:Dan Anda tidak akan memiliki masalah apa pun.
sumber
Ketika Anda mengevaluasi kode, sangat jelas bahwa (==) membandingkan menurut alamat memori, sementara sama dengan (Objek o) membandingkan kode hash () dari instance. Itu sebabnya dikatakan jangan putus kontrak antara equals () dan hashCode () jika Anda tidak menghadapi kejutan nanti.
sumber
Berikut adalah aturan umum untuk perbedaan antara
relational operator ==
danthe method .equals()
.object1 == object2
membandingkan jika objek yang dirujuk oleh object1 dan object2 merujuk ke lokasi memori yang sama di Heap .object1.equals(object2)
membandingkan nilai-nilai dari object1 dan object2 terlepas dari di mana mereka berada di memori .Ini dapat ditunjukkan dengan baik menggunakan String
skenario 1
Skenario 2
Perbandingan string ini dapat digunakan sebagai dasar untuk membandingkan jenis objek lainnya.
Sebagai contoh jika saya memiliki kelas Person , saya perlu mendefinisikan kriteria berdasarkan mana saya akan membandingkan dua orang . Katakanlah kelas orang ini memiliki variabel instan tinggi dan berat badan.
Jadi membuat objek orang
person1 and person2
dan untuk membandingkan keduanya dengan menggunakan.equals()
saya perlu mengganti metode yang sama dari kelas orang untuk menentukan berdasarkan variabel instance mana (tinggi atau berat) perbandingannya.Namun demikian
== operator will still return results based on the memory location of the two objects(person1 and person2)
.Untuk memudahkan generalisasi perbandingan objek orang ini, saya telah membuat kelas tes berikut. Bereksperimen dengan konsep-konsep ini akan mengungkapkan banyak fakta .
Hasil dari eksekusi kelas ini adalah:
sumber
Perhatikan juga bahwa
.equals()
biasanya berisi==
untuk pengujian karena ini adalah hal pertama yang ingin Anda uji jika Anda ingin menguji apakah dua objek sama.Dan
==
sebenarnya melihat nilai untuk tipe primitif, untuk objek yang memeriksa referensi.sumber
== referensi selalu operator dibandingkan. Tetapi dalam kasus
itu tergantung pada implementasi jika kita ditimpa sama dengan metode daripada membandingkan objek pada dasar implementasi yang diberikan dalam metode ditimpa.
dalam kode di atas baik objek obj dan objek obj1 berisi data yang sama tetapi referensi tidak sama sehingga sama dengan return false dan == juga. tetapi jika kita menimpa sama dengan metode daripada
tahu periksa itu akan mengembalikan benar dan salah untuk kasus yang sama hanya kami menimpa
itu membandingkan objek berdasarkan konten (id) objek
masih membandingkan referensi objek.
sumber
Perbedaan utama antara == dan equals () adalah
1) == digunakan untuk membandingkan primitif.
Sebagai contoh :
2) sama dengan () digunakan untuk membandingkan objek. Sebagai contoh :
sumber
==
dapat digunakan dalam banyak jenis objek tetapi Anda dapat menggunakanObject.equals
untuk semua jenis, terutama Strings dan Google Map Markers.sumber
---- Output ----- benar salah benar
sumber
Mungkin perlu ditambahkan bahwa untuk objek wrapper untuk tipe primitif - yaitu Int, Long, Double - == akan mengembalikan true jika kedua nilai tersebut sama.
Sebaliknya, menempatkan dua Longs di atas ke dalam dua ArrayLists yang terpisah, sama dengan melihatnya sebagai sama, tetapi == tidak.
sumber
Long a = 128l; Long b = 128l; System.out.println(a == b);
The String kolam renang (alias magang ) dan Integer kolam renang blur perbedaan lebih lanjut, dan memungkinkan Anda untuk menggunakan
==
objek dalam beberapa kasus bukannya.equals
Ini dapat memberi Anda kinerja yang lebih besar (?), Dengan biaya kompleksitas yang lebih besar.
Misalnya:
Pengorbanan kompleksitas: yang berikut mungkin akan mengejutkan Anda:
Saya menyarankan Anda untuk menjauh dari optimasi mikro seperti itu, dan selalu gunakan
.equals
untuk objek, dan==
untuk primitif:sumber
Singkatnya, jawabannya adalah "Ya".
Di Jawa,
==
operator membandingkan dua objek untuk melihat apakah mereka menunjuk ke lokasi memori yang sama; sedangkan.equals()
metode sebenarnya membandingkan dua objek untuk melihat apakah mereka memiliki nilai objek yang sama.sumber
Pada dasarnya,
==
bandingkan jika dua objek memiliki referensi yang sama pada heap, jadi kecuali jika dua referensi terkait dengan objek yang sama, perbandingan ini akan salah.equals()
adalah metode yang diwarisi dariObject
kelas. Metode ini secara default membandingkan jika dua objek memiliki referensi yang sama. Itu berarti:object1.equals(object2)
<=>object1 == object2
Namun, jika Anda ingin membangun kesetaraan antara dua objek dari kelas yang sama Anda harus mengganti metode ini. Juga sangat penting untuk mengganti metode
hashCode()
jika Anda telah menimpaequals()
.Terapkan
hashCode()
ketika menetapkan kesetaraan adalah bagian dari Kontrak Obyek Java. Jika Anda bekerja dengan koleksi, dan Anda belum menerapkannyahashCode()
, Strange Bad Things dapat terjadi:null
akan dicetak setelah menjalankan kode sebelumnya jika Anda belum menerapkanhashCode()
.sumber
Karena Java tidak mendukung overloading operator, == berperilaku identik untuk setiap objek tetapi equals () adalah metode, yang dapat ditimpa dalam Java dan logika untuk membandingkan objek dapat diubah berdasarkan aturan bisnis.
Perbedaan utama antara == dan sama dengan di Jawa adalah bahwa "==" digunakan untuk membandingkan primitif sementara metode equals () disarankan untuk memeriksa persamaan objek.
Perbandingan string adalah skenario umum menggunakan keduanya == dan sama dengan metode. Karena kelas java.lang.String menimpa metode yang sama, Ini mengembalikan true jika dua objek String berisi konten yang sama tetapi == hanya akan mengembalikan true jika dua referensi menunjuk ke objek yang sama.
Berikut adalah contoh membandingkan dua String di Jawa untuk kesetaraan menggunakan metode == dan equals () yang akan menghapus beberapa keraguan:
sumber