HashCode是什么?有什么作用?
Java中Object有一個(gè)方法:
Java復(fù)制代碼
1public native int hashcode();
1. hashcode()方法的作用
hashcode()方法主要配合基于散列的集合一起使用,比如HashSet、HashMap、HashTable。 當(dāng)集合需要添加新的對(duì)象時(shí),先調(diào)用這個(gè)對(duì)象的hashcode()方法,得到對(duì)應(yīng)的hashcode值,實(shí)際上hashmap中會(huì)有一個(gè)table保存已經(jīng)存進(jìn)去的對(duì)象的hashcode值,如果table中沒(méi)有改hashcode值,則直接存入,如果有,就調(diào)用equals方法與新元素進(jìn)行比較,相同就不存了,不同就存入。
2. equals和hashcode的關(guān)系
●如果equals為true,hashcode一定相等;
●如果equals為false,hashcode不一定不相等;
●如果hashcode值相等,equals不一定相等;
●如果hashcode值不等,equals一定不等;
● 重寫equals方法時(shí),一定要重寫hashcode方法
3. 總結(jié)
hashcode是用來(lái)查找的,如果你學(xué)過(guò)數(shù)據(jù)結(jié)構(gòu)就應(yīng)該知道,在查找和排序這一章有 例如內(nèi)存中有這樣的位置0 1 2 3 4 5 6 7
而我有個(gè)類,這個(gè)類有個(gè)字段叫ID,我要把這個(gè)類存放在以上8個(gè)位置之一,如果不用hashcode而任意存放,那么當(dāng)查找時(shí)就需要到這八個(gè)位置里挨個(gè)去找,或者用二分法一類的算法。
但如果用hashcode那就會(huì)使效率提高很多。我們這個(gè)類中有個(gè)字段叫ID,那么我們就定義我們的hashcode為ID%8,然后把我們的類存放在取得得余數(shù)那個(gè)位置。比如我們的ID為9,9除8的余數(shù)為1,那么我們就把該類存在1這個(gè)位置,如果ID是13,求得的余數(shù)是5,那么我們就把該類放在5這個(gè)位置。這樣,以后在查找該類時(shí)就可以通過(guò)ID除 8求余數(shù)直接找到存放的位置了。
但是如果兩個(gè)類有相同的hashcode怎么辦那(我們假設(shè)上面的類的ID不是唯一的),例如9除以8和17除以8的余數(shù)都是1,那么這是不是合法的,回答是:可以這樣。那么如何判斷呢?在這個(gè)時(shí)候就需要定義 equals了。也就是說(shuō),我們先通過(guò) hashcode來(lái)判斷兩個(gè)類是否存放某個(gè)桶里,但這個(gè)桶里可能有很多類,那么我們就需要再通過(guò) equals 來(lái)在這個(gè)桶里找到我們要的類。
那么重寫了equals(),為什么還要重寫hashCode()呢?想想,你要在一個(gè)桶里找東西,你必須先要找到這個(gè)桶啊,你不通過(guò)重寫hashcode()來(lái)找到桶,光重寫equals()有什么用啊。
更多關(guān)于“Java培訓(xùn)”的問(wèn)題,歡迎咨詢千鋒教育在線名師。千鋒已有十余年的培訓(xùn)經(jīng)驗(yàn),課程大綱更科學(xué)更專業(yè),有針對(duì)零基礎(chǔ)的就業(yè)班,有針對(duì)想提升技術(shù)的好程序員班,高品質(zhì)課程助力你實(shí)現(xiàn)java程序員夢(mèng)想。