Rumah  >  Artikel  >  Java  >  Bagaimana untuk menggunakan kaedah hashCode dalam Java

Bagaimana untuk menggunakan kaedah hashCode dalam Java

WBOY
WBOYke hadapan
2023-05-11 13:49:061738semak imbas

1. Perkenalkan kaedah hashCode

  • hashCode() Fungsinya adalah untuk mendapatkan kod cincang, juga dipanggil kod cincang, yang sebenarnya mengembalikan integer int. Tujuan kod cincang ini adalah untuk menentukan kedudukan indeks objek dalam jadual cincang.

  • hashCode() ditakrifkan dalam Object.java JDK, yang bermaksud mana-mana kelas dalam Java mengandungi fungsi hashCode().

  • Jadual cincang menyimpan pasangan nilai kunci. Cirinya ialah ia boleh mendapatkan semula "nilai" yang sepadan dengan cepat mengikut "kunci". Ini menggunakan kod cincang! (Anda boleh mencari objek yang anda perlukan dengan cepat).

2. Mengapakah kaedah hashCode diperlukan?

Dalam proses menulis program, menilai sama ada dua objek adalah sama adalah masalah yang sangat biasa dan sering dihadapi. Kaedah hashCode() digunakan untuk meningkatkan kelajuan membandingkan dua objek.

Mari kita ambil "Cara menyemak pendua dalam HashSet" sebagai contoh untuk menerangkan sebab hashCode diperlukan:

  • Apabila anda menambah objek pada HashSet, HashSet akan hitung dahulu Nilai hashcode objek digunakan untuk menentukan lokasi objek ditambah Ia juga akan dibandingkan dengan nilai hashcode objek lain yang telah ditambah Jika tiada padanan hashcode, HashSet akan menganggap bahawa objek tidak muncul berulang kali.

  • Tetapi jika objek dengan nilai hashcode yang sama ditemui, kaedah equals() akan dipanggil untuk menyemak sama ada hashcode objek yang sama adalah benar-benar sama. Jika kedua-duanya adalah sama, HashSet tidak akan membenarkan operasi bergabung berjaya. Jika berbeza, ia akan dirombak semula ke lokasi lain.

  • Dengan cara ini kami sangat mengurangkan bilangan equals dan dengan itu meningkatkan kelajuan pelaksanaan dengan banyak.

3. Apakah hubungan antara kaedah hashCode() dan equals()?

Java menetapkan kaedah eqauls() dan kaedah hashCode() seperti berikut:

  • Memanggil kaedah hashCode() beberapa kali pada objek yang sama sentiasa mengembalikan nilai integer yang sama.

  • Jika a.sama dengan(b), maka a.hashCode() mestilah sama dengan b.hashCode().

  • Jika !a.sama dengan(b), maka a.hashCode() tidak semestinya sama dengan b.hashCode(). Pada masa ini, jika a.hashCode() sentiasa tidak sama dengan b.hashCode(), prestasi jadual hash akan dipertingkatkan.

  • a.hashCode()==b.hashCode() kemudian a.equals(b) boleh menjadi benar atau palsu

  • a. Kod hash ()! = b.hashCode() maka a.equals(b) adalah palsu.

Ringkasan ringkas kesimpulan di atas:

  • Jika dua objek sama, persekitaran masa jalan Java akan berfikir bahawa Kod hash mereka mestilah sama.

  • Jika dua objek tidak sama, Kod cincang mereka mungkin sama.

  • Jika Kod cincang dua objek adalah sama, ia tidak semestinya sama.

  • Jika Kod cincang dua objek tidak sama, ia mestilah tidak sama.

4 Mengapa mesti mengatasi kaedah yang sama mengatasi kaedah kod cincang?

  • Kami menjelaskan di atas bahawa jika dua objek equals, maka nilai hashCode mereka mestilah sama. Jika anda hanya menulis semula kaedah equals tanpa menulis semula kaedah hashCode, nilai hashCode akan berbeza, dan hasil yang ditentukan oleh kaedah equals akan menjadi true.

  • Dalam beberapa bekas di Jawa, dua objek yang serupa tidak dibenarkan Apabila memasukkan, jika mereka dinilai sama, ia akan ditimpa. Pada masa ini, jika anda hanya menulis semula kaedah equals tanpa menulis semula kaedah hashCode, hashCode dalam Object ialah nilai cincang yang dibentuk berdasarkan penukaran alamat storan objek. Pada masa ini, ada kemungkinan kerana kaedah hashCode tidak ditindih, objek yang sama dicincang ke lokasi yang berbeza, mengakibatkan masalah objek itu tidak boleh ditulis ganti.

Contohnya

Kelas anjing

package com.xiao;

/**
 * @author :小肖
 * @date :Created in 2022/3/11 14:42
 */
public class Dog {

    private String name;

    private Integer age;


    public Dog() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Dog(String name, Integer age) {
        this.name = name;
        this.age = age;
    }


    @Override
    public boolean equals(Object obj) {
        if(obj.getClass() != getClass()){
            return false;
        }
        Dog dog = (Dog) obj;
        if(dog.getAge() == age && dog.getName().equals(name)){
            return true;
        }
        return false;
    }
}

Kelas ujian

import com.xiao.Dog;

public class Test {

    public static void main(String[] args) {
        Dog dog = new Dog("小旺",2);
        Dog dog1 = new Dog("小旺",2);
        System.out.println("equals结果:" + dog.equals(dog1));
        System.out.println("dog 的 hashCode 值是否等于 dog1 的 hashCode 值:" +(dog.hashCode() == dog1.hashCode()));
    }
}

Hasil ujian

sama result : true
Sama ada nilai hashCode anjing adalah sama dengan nilai hashCode dog1: false

Atas ialah kandungan terperinci Bagaimana untuk menggunakan kaedah hashCode dalam Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam