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).
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.
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.
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!