hashCode()
的作用是取得雜湊碼,也稱為雜湊碼,它實際上是返回一個int整數。這個雜湊碼的作用是確定該物件在雜湊表中的索引位置。
hashCode()
定義在JDK的Object.java中,這表示Java中的任何類別都包含有hashCode()
函數。
散列表儲存的是鍵值對(key-value),它的特性是:能根據「鍵」快速的檢索出對應的「值」。這其中就利用到散列碼了! (可以快速找到所需要的物件)。
在我們寫程式的過程中,判斷兩個物件是否相同是十分常見且經常面對的一個問題。而 hashCode()
方法就是用來提升比較兩個物件的速度的。
我們就以「HashSet 如何檢查重複」為例子來說明為什麼要有hashCode:
當你把物件加入HashSet
時, HashSet 會先計算物件的hashcode
值來判斷物件加入的位置,同時也會與其他已加入的物件的hashcode
值進行比較,如果沒有相符的hashcode
, HashSet
會假設物件沒有重複出現。
但如果發現有相同hashcode
值的對象,這時會呼叫equals()方法來檢查hashcode
相等的物件是否真的相同。如果兩者相同, HashSet
就不會讓其加入操作成功。如果不同的話,就會重新散列到其他位置。
這樣我們就大大減少了 equals
的次數,對應就大大提高了執行速度。
Java 對於eqauls() 方法和hashCode() 方法是這樣規定的:
在同一物件上多次呼叫hashCode() 方法,總是傳回相同的整數值。
如果 a.equals(b),則一定有 a.hashCode() 一定等於 b.hashCode()。
如果 !a.equals(b),則 a.hashCode() 不一定等於 b.hashCode()。此時如果 a.hashCode() 總是不等於 b.hashCode(),會提升 hashtables 的效能。
a.hashCode()==b.hashCode() 則a.equals(b) 可真可假
a.hashCode ()! = b.hashCode() 則 a.equals(b) 為假。
上面結論簡記:
如果兩個物件 equals,Java 執行環境會認為他們的 hashCode 一定相等。
如果兩個物件不 equals,他們的 hashCode 有可能相等。
如果兩個物件 hashCode 相等,他們不一定 equals。
如果兩個物件 hashCode 不相等,他們一定不是 equals。
我們上面講解到 如果 兩個物件 equals
的話,那麼它們的 hashCode
值必然相等。如果只重寫了equals
方法,而不重寫hashCode
的方法,會造成hashCode
的值不同,而equals
方法判斷出來的結果為true
。
在Java中的某些容器中,不允許有兩個完全相同的對象,插入的時候,如果判斷相同則會被覆蓋。這時候如果只重寫了equals
的方法,而不重寫hashCode
的方法,Object中hashCode
是根據物件的儲存位址轉換而形成的一個哈希值。這時候就有可能因為沒有重寫 hashCode
方法,造成相同的物件雜湊到不同的位置而造成物件的不能覆蓋的問題。
例如
Dog類別
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; } }
測試類別
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())); } }
測試結果
equals結果:true
dog 的hashCode 值是否等於dog1 的hashCode 值:false
以上是Java中hashCode方法怎麼用的詳細內容。更多資訊請關注PHP中文網其他相關文章!