淺談java中的hashcode方法-java開發(fā)java經(jīng)驗(yàn)技巧

淺談java中的hashcode方法-java開發(fā)java經(jīng)驗(yàn)技巧

ID:30869760

大?。?0.00 KB

頁數(shù):8頁

時(shí)間:2019-01-03

淺談java中的hashcode方法-java開發(fā)java經(jīng)驗(yàn)技巧_第1頁
淺談java中的hashcode方法-java開發(fā)java經(jīng)驗(yàn)技巧_第2頁
淺談java中的hashcode方法-java開發(fā)java經(jīng)驗(yàn)技巧_第3頁
淺談java中的hashcode方法-java開發(fā)java經(jīng)驗(yàn)技巧_第4頁
淺談java中的hashcode方法-java開發(fā)java經(jīng)驗(yàn)技巧_第5頁
資源描述:

《淺談java中的hashcode方法-java開發(fā)java經(jīng)驗(yàn)技巧》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。

1、淺談Java中的hashcodc方法-編程開發(fā)技術(shù)淺談Java中的hashcode方法原文出處:海子哈希表這個(gè)數(shù)據(jù)結(jié)構(gòu)想必大多數(shù)人都不陌生,而且在很多地方都會(huì)利用到hash表來提高杳找效率。在J3V3的Object類中有一個(gè)方法:publicnativeinthashCode();根據(jù)這個(gè)方法的聲明可知,該方法返回一個(gè)int類型的數(shù)值,并且是木地方法,因此在Object類屮并沒有給出具體的實(shí)現(xiàn)。為何Object類需要這樣一個(gè)方法?它有什么作用呢?今天我們就來具體探討一FhashCode方法。一.hashCode方法的作用對于包含容器類型的程序設(shè)計(jì)語言來說,基木上都會(huì)

2、涉及到hashCodeo在Java中也一樣,hashCode方法的主要作用是為了配合基于散列的集合一起正常運(yùn)行,這樣的散列集合包括IlashSctxIlashMap以及IlashTablco為什么這么說呢?考慮一種情況,當(dāng)向集合屮插入對彖時(shí),如何判別在集合屮是否已經(jīng)存在該對彖了?(注意:集合中不允許重復(fù)的元素存在)也許大多數(shù)人都會(huì)想到調(diào)用equals方法來逐個(gè)進(jìn)行比較,這個(gè)方法確實(shí)可行。但是如果集合中已經(jīng)存在一力條數(shù)據(jù)或者更多的數(shù)據(jù),如果采用equals方法去逐一比較,效率必然是一個(gè)問題。此時(shí)hashCode方法的作用就體現(xiàn)出來了,當(dāng)集合要添加新的對象時(shí),先調(diào)用這個(gè)

3、對象的hashCode方法,得到對應(yīng)的hashcode值,實(shí)際上在HashMap的具體實(shí)現(xiàn)中會(huì)用一個(gè)table保存已經(jīng)存進(jìn)去的對象的hashcode值,如果table中沒有該hashcode值,它就可以直接存進(jìn)去,不用再進(jìn)彳亍任何比較了;如果存在該hashcode值,就調(diào)用它的equals方法與新元素進(jìn)行比較,相同的話就不存了,不相同就散列其它的地址,所以這里存在一個(gè)沖突解決的問題,這樣一來實(shí)際調(diào)用equals方法的次數(shù)就大大降低了,說通俗一點(diǎn):Java中的hashCode方法就是根據(jù)一定的規(guī)則將與對象和關(guān)的信息(比如對象的存儲(chǔ)地址,對象的字段等)映射成一個(gè)數(shù)值,這

4、個(gè)數(shù)值稱作為散列值。下面這段代碼是java.util.IlashMap的中put方法的具體實(shí)現(xiàn):publicVput(Kkey,Vvalue){if(key==null)returnputForNullKey(value);inthash二hash(key.hashCode());inti=indexFor(hash,table.length);for(Entrye=table[i];e!=null;e=e.next){Objectk;if(e.hash二二hash&&((k二e.key)二二keykey.equals(k)))VoldValue=e.va

5、lue;e.value=value;e.recordAccess(this);returnoldValue;modCount++;addEntry(hash,key,value,i);returnnull;}put方法是用來向HashMap中添加新的元素,從put方法的具體實(shí)現(xiàn)可知,會(huì)先調(diào)用hashCode方法得到該元索的hashCode值,然后查看table中是否存在該hashCode值,如果存在則調(diào)用equals方法重新確定是否存在該元素,如果存在,則更新value值,否則將新的元素添加到HashMap屮。從這里可以看出,hashCode方法的存在是為了減少eq

6、uals方法的調(diào)用次數(shù),從而提高程序效率。如果對于hash表這個(gè)數(shù)據(jù)結(jié)構(gòu)的朋友不清楚,可以參考這幾篇博文;http://www.cnblogs.com/jiewei915/archive/2010/08/09/1796042.htmlhttp://www.cnblogs.com/dolphin0520/archive/2012/09/28/2700000.htmlhttp://www.java3z.com/cwbwebhome/artic1e/artic1e8/83560.html?id二4649有些朋友謀以為默認(rèn)情況F,hashCode返回的就是對象的存儲(chǔ)地址,事

7、實(shí)上這種看法是不全而的,確實(shí)冇些JVM在實(shí)現(xiàn)時(shí)是直接返回對象的存儲(chǔ)地址,但是大多時(shí)候并不是這樣,只能說可能存儲(chǔ)地址有一定關(guān)聯(lián)。下面是HotSpotJVM中生成hash散列值的實(shí)現(xiàn):staticinlineintptr_tget_next_hash(Thread*Self,oopobj){intptrtvalue=0;if(hashCode==0){//ThisformusesanunguardedglobalPark-MillerRNG,//soit,spossiblefortwothreadstoraceandgeneratethesameRNG.//OnMP

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時(shí)聯(lián)系客服。
3. 下載前請仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請聯(lián)系客服處理。