您好,登錄后才能下訂單哦!
這篇文章主要介紹“Java中的hashCode方法如何用”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Java中的hashCode方法如何用”文章能幫助大家解決問題。
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方法如何用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。