這篇文章主要介紹“Java中的hashCode方法如何用”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“Java中的hashCode方法如何用”文章能幫助大家解決問(wèn)題。
創(chuàng)新互聯(lián)主要從事網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)京口,10多年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):13518219792
hashCode()
的作用是獲取哈希碼,也稱為散列碼,它實(shí)際上是返回一個(gè)int整數(shù)。這個(gè)哈希碼的作用是確定該對(duì)象在哈希表中的索引位置。
hashCode()
定義在JDK的Object.java中,這就意味著Java中的任何類都包含有 hashCode()
函數(shù)。
散列表存儲(chǔ)的是鍵值對(duì)(key-value),它的特點(diǎn)是:能根據(jù)“鍵”快速的檢索出對(duì)應(yīng)的“值”。這其中就利用到了散列碼?。梢钥焖僬业剿枰膶?duì)象)。
在我們編寫程序的過(guò)程中,判斷兩個(gè)對(duì)象是否相同是十分常見(jiàn)且經(jīng)常面對(duì)的一個(gè)問(wèn)題。而 hashCode()
方法就是用來(lái)提升比較兩個(gè)對(duì)象的速度的。
我們就以“HashSet 如何檢查重復(fù)”為例子來(lái)說(shuō)明為什么要有 hashCode:
當(dāng)你把對(duì)象加入 HashSet
時(shí),HashSet 會(huì)先計(jì)算對(duì)象的 hashcode
值來(lái)判斷對(duì)象加入的位置,同時(shí)也會(huì)與其他已經(jīng)加入的對(duì)象的 hashcode
值作比較,如果沒(méi)有相符的 hashcode
, HashSet
會(huì)假設(shè)對(duì)象沒(méi)有重復(fù)出現(xiàn)。
但是如果發(fā)現(xiàn)有相同 hashcode
值的對(duì)象,這時(shí)會(huì)調(diào)用 equals()方法來(lái)檢查 hashcode
相等的對(duì)象是否真的相同。如果兩者相同, HashSet
就不會(huì)讓其加入操作成功。如果不同的話,就會(huì)重新散列到其他位置。
這樣我們就大大減少了 equals
的次數(shù),相應(yīng)就大大提高了執(zhí)行速度。
Java 對(duì)于 eqauls() 方法和 hashCode() 方法是這樣規(guī)定的:
同一對(duì)象上多次調(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é)論簡(jiǎn)記:
如果兩個(gè)對(duì)象 equals,Java 運(yùn)行時(shí)環(huán)境會(huì)認(rèn)為他們的 hashCode 一定相等。
如果兩個(gè)對(duì)象不 equals,他們的 hashCode 有可能相等。
如果兩個(gè)對(duì)象 hashCode 相等,他們不一定 equals。
如果兩個(gè)對(duì)象 hashCode 不相等,他們一定不 equals。
我們上面講解到 如果 兩個(gè)對(duì)象 equals
的話,那么它們的 hashCode
值必然相等。如果只重寫了 equals
方法,而不重寫 hashCode
的方法,會(huì)造成 hashCode
的值不同,而 equals
方法判斷出來(lái)的結(jié)果為true
。
在Java中的一些容器中,不允許有兩個(gè)完全相同的對(duì)象,插入的時(shí)候,如果判斷相同則會(huì)進(jìn)行覆蓋。這時(shí)候如果只重寫了 equals
的方法,而不重寫 hashCode
的方法,Object中 hashCode
是根據(jù)對(duì)象的存儲(chǔ)地址轉(zhuǎn)換而形成的一個(gè)哈希值。這時(shí)候就有可能因?yàn)闆](méi)有重寫 hashCode
方法,造成相同的對(duì)象散列到不同的位置而造成對(duì)象的不能覆蓋的問(wèn)題。
例如
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; } }
測(cè)試類
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())); } }
測(cè)試結(jié)果
equals結(jié)果:true
dog 的 hashCode 值是否等于 dog1 的 hashCode 值:false
關(guān)于“Java中的hashCode方法如何用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。