Java Collections – hashCode() dan equals() – Bagaimana Mengganti Metode equals() dan hashcode() di Java?

Diterbitkan: 2018-08-08
Kode hash Koleksi Java dan yang setara

equals() dan hashCode() di Java adalah dua metode dasar yang dideklarasikan di kelas Object dan sebagian atau inti Java library.

Jika Anda memiliki salah satu dari masalah di bawah ini di Jawa maka Anda berada di tempat yang tepat.

  • Praktik Java -> Menerapkan persamaan
  • override – Mengganti persamaan dan kode hash di Java
  • Cara mengganti metode equals() di java
  • Cara mengganti metode hashCode() di java
  • Bagaimana cara mengganti metode equals dan hashCode di Java
  • Bagaimana dan Mengapa Mengganti Metode yang sama di Java
  • Mengapa selalu menimpa kode hash() jika menimpa equals()?

Mari kita lihat contoh sederhana untuk memahami terlebih dahulu Reference Equality Logical Equality . Operator kesetaraan (==) membandingkan referensi (alamat dalam memori) dari dua String sebagai dua angka yang berbeda - ini dikenal sebagai Reference equality .

Logical equality membandingkan data objek alih-alih nilai referensi.

Keluaran:

hashCode dan equals terkait erat:

  • jika Anda mengganti equals , Anda harus mengganti hashCode .
  • kode hash harus menghasilkan nilai yang sama untuk objek yang sama.
  • equals dan hashCode harus bergantung pada same set of significant fields . Anda harus menggunakan kumpulan bidang yang sama di kedua metode ini. Anda tidak diharuskan untuk menggunakan semua bidang. Misalnya, bidang terhitung yang bergantung pada orang lain kemungkinan besar harus dihilangkan dari equals dan hashCode .

Saat menerapkan equals , bidang dibandingkan secara berbeda, menurut jenisnya:

  • bidang objek, termasuk koleksi: gunakan equals
  • enumerasi tipe-aman : gunakan sama dengan atau == (jumlahnya sama, dalam hal ini)
  • bidang objek mungkin-null : gunakan keduanya == dan sama dengan
  • bidang array : gunakan Arrays.equals
  • bidang primitif selain float atau double : gunakan ==
  • float : konversi ke int menggunakan Float.floatToIntBits , lalu gunakan ==
  • double : konversi ke long menggunakan Double.doubleToLongBits , lalu gunakan ==

Menerapkan kode hash :

  • jika kelas menimpa equals , itu harus menimpa kode hash
  • ketika keduanya diganti, equals dan hashCode harus menggunakan kumpulan bidang yang sama
  • jika dua objek sama, maka nilai kode hashnya juga harus sama
  • jika objek tidak dapat diubah, maka kode hash adalah kandidat untuk caching dan inisialisasi malas

Ini adalah kesalahpahaman populer bahwa kode hash menyediakan pengidentifikasi unik untuk suatu objek. Itu tidak.

Dengan kontrak umum, metode equals() di Java harus refleksif, simetris, transitif, konsisten, dan referensi non-null harus menghasilkan false. Dengan kata lain, untuk nilai sembarang dari a, b, dan c, pengujian berikut harus selalu lulus:

Untuk Praktik terbaik, gunakan langkah-langkah di bawah ini untuk mengimplementasikan metode equals() Anda:

  • Gunakan ini == itu untuk memeriksa kesetaraan referensi
  • Gunakan instanceof untuk menguji tipe argumen yang benar
  • Berikan argumen ke jenis yang benar
  • Bandingkan bidang yang signifikan untuk kesetaraan

Berikut adalah Contoh Lengkap.

CrunchifyImplementEqualsHashCode.java

Keluaran Konsol Eclipse: