hashmap的工作原理-java開發(fā)java經(jīng)驗技巧

hashmap的工作原理-java開發(fā)java經(jīng)驗技巧

ID:30778231

大小:53.50 KB

頁數(shù):4頁

時間:2019-01-03

hashmap的工作原理-java開發(fā)java經(jīng)驗技巧_第1頁
hashmap的工作原理-java開發(fā)java經(jīng)驗技巧_第2頁
hashmap的工作原理-java開發(fā)java經(jīng)驗技巧_第3頁
hashmap的工作原理-java開發(fā)java經(jīng)驗技巧_第4頁
資源描述:

《hashmap的工作原理-java開發(fā)java經(jīng)驗技巧》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫

1、HashMap的工作原理-Java開發(fā)Java經(jīng)驗技巧HashMap的工作原理木文由ImportNew?唐小娟翻譯自Javarevisitedo歡迎加入翻譯小組。轉(zhuǎn)載請見文末要求。HashMap的工作原理是近年來常見的Java面試題。幾乎每個Java程序員都知道HashMap,都知道哪里要用HashMap,知道Ilashtablc和HashMap之間的區(qū)別,那么為何這道而試題如此特殊呢?是因為這道題考察的深度很深。這題經(jīng)常出現(xiàn)在高級或中高級面試中。投資銀行更喜歡問這個問題,甚至?xí)竽銓崿F(xiàn)HashMap來考察你的編程能力。Concurrent

2、HashMap和其它同步集合的引入讓這道題變得更加復(fù)雜。讓我們開始探索的旅程吧!先來些簡單的問題“你用過HashMap嗎?”“什么是HashMap?你為什么用到它?”幾乎每個人都會回答“是的”,然后回答HashMap的一些特性,譬如HashMap口J以接受nul1鍵值和值,而Hashtable則不能;HashMap是非synchronized;HashMap很快;以及HashMap儲存的是鍵值對等等。這顯示出你已經(jīng)用過HashMap,而且對它相當(dāng)?shù)氖煜?。但是而試官來個急轉(zhuǎn)直下,從此刻開始問出一些刁鉆的問題,關(guān)于HashMap的更多基礎(chǔ)的細節(jié)。

3、面試官可能會問出下面的問題:“你知道HashMap的工作原理嗎?”“你知道HashMap的get()方法的工作原理嗎?”你也許會回答“我沒冇詳查標(biāo)準(zhǔn)的JavaAPI,你可以看看Java源代碼或者OpenJDKo”“我可以用Google找到答案?!钡恍┟嬖囌呖赡芸梢越o出答案,uHashMap是基于hashing的原理,我們使用put(key,value)存儲對象到HashMap中,使用get(key)從HashMap中獲取對象。當(dāng)我們給put()方法傳遞鍵和值時,我們先對鍵調(diào)用hashCodcO方法,返回的hashCode用于找到bucket

4、位置來儲存Entry對象?!边@里關(guān)鍵點在于指出,HashMap是在bucket中儲存鍵對彖和值對彖,作為Map.Entry<>這一點有助于理解獲取對象的邏輯。如果你沒有意識到這一點,或者錯誤的認(rèn)為僅僅只在bucket中存儲值的話,你將不會回答如何從HashMap中獲取對象的邏輯。這個答案相當(dāng)?shù)闹勾_,也顯示出面試者確實知道hashing以及HashMap的工作原理。但是這僅僅是故事的開始,當(dāng)而試官加入一些Java程序員每天要碰到的實際場景的時候,錯誤的答案頻現(xiàn)。下個問題可能是關(guān)于HashMap中的碰撞探測(collisiondetection)

5、以及碰撞的解決方法:“當(dāng)兩個對象的hashcode相同會發(fā)生什么?”從這里開始,真正的困惑開始了,一些面試者會冋答因為hashcode相同,所以兩個對彖是相等的,HashMap將會拋出異常,或者不會存儲它們。然后面試官可能會提醒他們有equals()和hashCode()兩個方法,并告訴他們兩個對象就算hashcode相同,但是它們口J能并不相等。一些面試者可能就此放棄,而另外一些還能繼續(xù)挺進,他們回答“因為hashcode相同,所以它們的bucket位置相同,"碰撞'會發(fā)生。因為HashMap使用鏈表存儲對彖,這個Entry(包含有鍵值對的

6、Map.Entry對彖)會存儲在鏈表屮。”這個答案非常的合理,雖然有很多種處理碰撞的方法,這種方法是最簡單的,也正是HashMap的處理方法。但故事還沒有完結(jié),面試官會繼續(xù)問:“如果兩個鍵的hashcode相同,你如何獲取值對象?”而試者會回答:當(dāng)我們調(diào)用get()方法,HashMap會使用鍵對象的hashcode找到bucket位置,然后獲取值對象。面試官提醍他如果有兩個值對象儲存在同一個bucket,他給出答案:將會遍歷鏈表一直到找到值對象。面試官會問因為你并沒有值對象去比較,你是如何確定確定找到值對象的?除非面試者直到HashMap在鏈

7、表中存儲的是鍵值對,否則他們不可能回答出這一題。其中一些記得這個重要知識點的面試者會說,找到bucket位置Z后,會調(diào)用keys,equals()方法去找到鏈表屮正確的節(jié)點,最終找到要找的值對象。完美的答案!許多情況下,面試者會在這個環(huán)節(jié)屮出錯,因為他們混淆了hashCode()和equals()方法。因為在此之前hashCodeO屢屢出現(xiàn),而equals()方法僅僅在獲取值對象的時候才出現(xiàn)。一些優(yōu)秀的開發(fā)者會指出使用不可變的、聲明作final的對象,并月.采用合適的equals()和hashCode()方法的話,將會減少碰撞的發(fā)生,提高效率

8、。不可變性使得能夠緩存不同鍵的hashcode,這將提高整個獲取對象的速度,使用String,Interger這樣的wrapper類作為鍵是非常好的選擇。如果你認(rèn)為

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

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

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