您好,登錄后才能下訂單哦!
這篇文章主要介紹“Java中的hashCode方法如何用”的相關(guān)知識(shí),小編通過實(shí)際案例向大家展示操作過程,操作方法簡單快捷,實(shí)用性強(qiáng),希望這篇“Java中的hashCode方法如何用”文章能幫助大家解決問題。
hashCode()
的作用是獲取哈希碼,也稱為散列碼,它實(shí)際上是返回一個(gè)int整數(shù)。這個(gè)哈希碼的作用是確定該對象在哈希表中的索引位置。
hashCode()
定義在JDK的Object.java中,這就意味著Java中的任何類都包含有 hashCode()
函數(shù)。
散列表存儲(chǔ)的是鍵值對(key-value),它的特點(diǎn)是:能根據(jù)“鍵”快速的檢索出對應(yīng)的“值”。這其中就利用到了散列碼?。梢钥焖僬业剿枰膶ο螅?/p>
在我們編寫程序的過程中,判斷兩個(gè)對象是否相同是十分常見且經(jīng)常面對的一個(gè)問題。而 hashCode()
方法就是用來提升比較兩個(gè)對象的速度的。
我們就以“HashSet 如何檢查重復(fù)”為例子來說明為什么要有 hashCode:
當(dāng)你把對象加入 HashSet
時(shí),HashSet 會(huì)先計(jì)算對象的 hashcode
值來判斷對象加入的位置,同時(shí)也會(huì)與其他已經(jīng)加入的對象的 hashcode
值作比較,如果沒有相符的 hashcode
, HashSet
會(huì)假設(shè)對象沒有重復(fù)出現(xiàn)。
但是如果發(fā)現(xiàn)有相同 hashcode
值的對象,這時(shí)會(huì)調(diào)用 equals()方法來檢查 hashcode
相等的對象是否真的相同。如果兩者相同, HashSet
就不會(huì)讓其加入操作成功。如果不同的話,就會(huì)重新散列到其他位置。
這樣我們就大大減少了 equals
的次數(shù),相應(yīng)就大大提高了執(zhí)行速度。
Java 對于 eqauls() 方法和 hashCode() 方法是這樣規(guī)定的:
同一對象上多次調(diào)用 hashCode() 方法,總是返回相同的整型值。
如果 a.equals(b),則一定有 a.hashCode() 一定等于 b.hashCode()。
如果 !a.equals(b),則 a.hashCode() 不一定等于 b.hashCode()。此時(shí)如果 a.hashCode() 總是不等于 b.hashCode(),會(huì)提高 hashtables 的性能。
a.hashCode()==b.hashCode() 則 a.equals(b) 可真可假
a.hashCode()!= b.hashCode() 則 a.equals(b) 為假。
上面結(jié)論簡記:
如果兩個(gè)對象 equals,Java 運(yùn)行時(shí)環(huán)境會(huì)認(rèn)為他們的 hashCode 一定相等。
如果兩個(gè)對象不 equals,他們的 hashCode 有可能相等。
如果兩個(gè)對象 hashCode 相等,他們不一定 equals。
如果兩個(gè)對象 hashCode 不相等,他們一定不 equals。
我們上面講解到 如果 兩個(gè)對象 equals
的話,那么它們的 hashCode
值必然相等。如果只重寫了 equals
方法,而不重寫 hashCode
的方法,會(huì)造成 hashCode
的值不同,而 equals
方法判斷出來的結(jié)果為true
。
在Java中的一些容器中,不允許有兩個(gè)完全相同的對象,插入的時(shí)候,如果判斷相同則會(huì)進(jìn)行覆蓋。這時(shí)候如果只重寫了 equals
的方法,而不重寫 hashCode
的方法,Object中 hashCode
是根據(jù)對象的存儲(chǔ)地址轉(zhuǎn)換而形成的一個(gè)哈希值。這時(shí)候就有可能因?yàn)闆]有重寫 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結(jié)果:" + dog.equals(dog1)); System.out.println("dog 的 hashCode 值是否等于 dog1 的 hashCode 值:" +(dog.hashCode() == dog1.hashCode())); } }
測試結(jié)果
equals結(jié)果:true
dog 的 hashCode 值是否等于 dog1 的 hashCode 值:false
關(guān)于“Java中的hashCode方法如何用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。