這篇文章主要介紹“Java中的hashCode方法如何用”的相關(guān)知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強(qiáng),希望這篇“Java中的hashCode方法如何用”文章能幫助大家解決問題。
創(chuàng)新互聯(lián)主要從事網(wǎng)站設(shè)計制作、成都網(wǎng)站制作、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)京口,10多年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):13518219792
hashCode()
的作用是獲取哈希碼,也稱為散列碼,它實際上是返回一個int整數(shù)。這個哈希碼的作用是確定該對象在哈希表中的索引位置。
hashCode()
定義在JDK的Object.java中,這就意味著Java中的任何類都包含有 hashCode()
函數(shù)。
散列表存儲的是鍵值對(key-value),它的特點(diǎn)是:能根據(jù)“鍵”快速的檢索出對應(yīng)的“值”。這其中就利用到了散列碼?。梢钥焖僬业剿枰膶ο螅?。
在我們編寫程序的過程中,判斷兩個對象是否相同是十分常見且經(jīng)常面對的一個問題。而 hashCode()
方法就是用來提升比較兩個對象的速度的。
我們就以“HashSet 如何檢查重復(fù)”為例子來說明為什么要有 hashCode:
當(dāng)你把對象加入 HashSet
時,HashSet 會先計算對象的 hashcode
值來判斷對象加入的位置,同時也會與其他已經(jīng)加入的對象的 hashcode
值作比較,如果沒有相符的 hashcode
, HashSet
會假設(shè)對象沒有重復(fù)出現(xiàn)。
但是如果發(fā)現(xiàn)有相同 hashcode
值的對象,這時會調(diào)用 equals()方法來檢查 hashcode
相等的對象是否真的相同。如果兩者相同, HashSet
就不會讓其加入操作成功。如果不同的話,就會重新散列到其他位置。
這樣我們就大大減少了 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()。此時如果 a.hashCode() 總是不等于 b.hashCode(),會提高 hashtables 的性能。
a.hashCode()==b.hashCode() 則 a.equals(b) 可真可假
a.hashCode()!= b.hashCode() 則 a.equals(b) 為假。
上面結(jié)論簡記:
如果兩個對象 equals,Java 運(yùn)行時環(huán)境會認(rèn)為他們的 hashCode 一定相等。
如果兩個對象不 equals,他們的 hashCode 有可能相等。
如果兩個對象 hashCode 相等,他們不一定 equals。
如果兩個對象 hashCode 不相等,他們一定不 equals。
我們上面講解到 如果 兩個對象 equals
的話,那么它們的 hashCode
值必然相等。如果只重寫了 equals
方法,而不重寫 hashCode
的方法,會造成 hashCode
的值不同,而 equals
方法判斷出來的結(jié)果為true
。
在Java中的一些容器中,不允許有兩個完全相同的對象,插入的時候,如果判斷相同則會進(jìn)行覆蓋。這時候如果只重寫了 equals
的方法,而不重寫 hashCode
的方法,Object中 hashCode
是根據(jù)對象的存儲地址轉(zhuǎ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)的知識,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點(diǎn)。
網(wǎng)站欄目:Java中的hashCode方法如何用
文章來源:http://jinyejixie.com/article16/pocedg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、響應(yīng)式網(wǎng)站、定制開發(fā)、企業(yè)建站、軟件開發(fā)、小程序開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)