Rumah >Java >javaTutorial >Bagaimana untuk Melaksanakan Kaedah hashCode() Teguh untuk Koleksi?

Bagaimana untuk Melaksanakan Kaedah hashCode() Teguh untuk Koleksi?

Susan Sarandon
Susan Sarandonasal
2024-12-14 12:38:11789semak imbas

How to Implement a Robust hashCode() Method for Collections?

Melaksanakan hashCode() untuk Koleksi: Amalan dan Pertimbangan Terbaik

Menentukan pelaksanaan optimum untuk kaedah hashCode() dalam koleksi ialah tugas yang bernuansa, sangat dipengaruhi oleh corak penggunaan tertentu. Walau bagaimanapun, pendekatan yang diiktiraf secara meluas dan berkesan telah digariskan oleh Josh Bloch dalam karya seminalnya, "Effective Java" (Item 8, edisi kedua).

Pelaksanaan Cadangan Josh Bloch

Menurut Bloch's cadangan, langkah-langkah berikut harus diikuti untuk mencipta kod hash() yang cekap kaedah:

  1. Memulakan pembolehubah hasil int dengan nilai bukan sifar.
  2. Lelaran pada setiap medan f yang disertakan dalam kaedah equals().
  3. Kira kod cincang c untuk setiap medan f berdasarkan jenis:

    • Untuk boolean: (f ? 0 : 1)
    • Untuk jenis primitif (bait, aksara, pendek, int): (int)f
    • Untuk jangka masa panjang: (int)(f ^ (f >>> 32))
    • Untuk apungan: Float.floatToIntBits(f)
    • Untuk double: Double.doubleToLongBits(f) (dikendalikan sebagai panjang)
    • Untuk objek: Gunakan hasil hashCode() atau 0 jika f == null
    • Untuk tatasusunan: Kira secara rekursif nilai cincang untuk setiap satu elemen
  4. Gabungkan nilai cincang yang dikira c dengan hasil:

    result = 37 * result + c
  5. Kembalikan hasil akhir.

Rasional Di Sebalik Pendekatan

Pendekatan ini memastikan pengagihan nilai hash yang betul untuk kebanyakan kes penggunaan dengan menggabungkan secara berkesan kod cincang semua medan yang diuji dalam kaedah equals(). Pendaraban dengan 37 dalam langkah gabungan meningkatkan lagi taburan.

Kesimpulan

Walaupun mungkin tidak ada pelaksanaan "terbaik" secara universal, pendekatan yang disyorkan Bloch menyediakan asas yang kukuh untuk mencipta Kod hash( ) kaedah untuk koleksi. Dengan mempertimbangkan dengan teliti corak penggunaan dan menggunakan langkah-langkah yang digariskan, pembangun boleh memastikan bahawa koleksi mereka berprestasi optimum berkenaan dengan operasi berasaskan cincang seperti contains() dan get().

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Kaedah hashCode() Teguh untuk Koleksi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn