Menambah jawaban @Lombo
Kapan Anda perlu mengganti equals ()?
Implementasi default Objects equals () adalah
public boolean equals(Object obj) {
return (this == obj);
}
yang berarti dua objek akan dianggap sama hanya jika mereka memiliki alamat memori yang sama yang hanya akan benar jika Anda membandingkan objek dengan dirinya sendiri.
Tetapi Anda mungkin ingin mempertimbangkan dua objek yang sama jika mereka memiliki nilai yang sama untuk satu atau lebih dari propertinya (Lihat contoh yang diberikan dalam jawaban @Lombo).
Jadi Anda akan mengesampingkan equals()
dalam situasi ini dan Anda akan memberikan kondisi Anda sendiri untuk kesetaraan.
Saya telah berhasil mengimplementasikan equals () dan itu berfungsi dengan baik. Jadi mengapa mereka meminta untuk mengganti kode hash () juga?
Baiklah. Selama Anda tidak menggunakan Koleksi berbasis "Hash" pada kelas yang ditentukan pengguna, tidak apa-apa. Tetapi beberapa waktu di masa depan Anda mungkin ingin menggunakan HashMap
atau HashSet
dan jika Anda tidak override
dan "menerapkan dengan benar" kode kode () , koleksi berbasis Hash ini tidak akan berfungsi sebagaimana dimaksud.
Timpa hanya sama dengan (Tambahan untuk jawaban @Lombo)
myMap.put(first,someValue)
myMap.contains(second); --> But it should be the same since the key are the same.But returns false!!! How?
Pertama-tama, HashMap memeriksa apakah kode hash second
sama dengan first
. Hanya jika nilainya sama, ia akan melanjutkan untuk memeriksa kesetaraan dalam ember yang sama.
Tapi di sini kode hash berbeda untuk 2 objek ini (karena mereka memiliki alamat memori yang berbeda-dari implementasi standar). Oleh karena itu bahkan tidak akan peduli untuk memeriksa kesetaraan.
Jika Anda memiliki breakpoint di dalam metode override yang sama dengan () Anda, itu tidak akan masuk jika mereka memiliki kode hash yang berbeda.
contains()
memeriksa hashCode()
dan hanya jika mereka sama itu akan memanggil equals()
metode Anda .
Mengapa kita tidak bisa melakukan pemeriksaan HashMap untuk kesetaraan di semua ember? Jadi tidak ada keharusan bagi saya untuk menimpa kode hash () !!
Maka Anda kehilangan titik Koleksi berbasis Hash. Pertimbangkan yang berikut ini:
Your hashCode() implementation : intObject%9.
Berikut ini adalah kunci-kunci yang disimpan dalam bentuk ember.
Bucket 1 : 1,10,19,... (in thousands)
Bucket 2 : 2,20,29...
Bucket 3 : 3,21,30,...
...
Katakan, Anda ingin tahu apakah peta tersebut berisi kunci 10. Apakah Anda ingin mencari semua kotak? atau Apakah Anda ingin mencari hanya satu ember?
Berdasarkan kode hash, Anda akan mengidentifikasi bahwa jika 10 ada, itu harus ada di Bucket 1. Jadi hanya Bucket 1 yang akan dicari !!