1. 程式人生 > >HashMap的實現原理以及面試官的提問

HashMap的實現原理以及面試官的提問

HashMap:按照特性來說明一下,儲存的是鍵值對,執行緒不安全,非Synchronied,儲存的比較快,能夠接受null。按照工作原理來敘述一下,Map的put(key,value)來儲存元素,通過get(key)來得到value值,通過hash演算法來計算hascode值,根據hashcode值來決定bucket(桶),儲存結構就算雜湊表。
提問:兩個hashcode相同的時候會發生說明?
hashcode相同,bucket的位置會相同,也就是說會發生碰撞,雜湊表中的結構其實有連結串列(LinkedList),這種衝突通過將元素儲存到LinkedList中,解決碰撞。儲存順序是仿在表頭。
如果兩個鍵的hashcode相同,如何獲取值物件?
如果兩個鍵的hashcode相同,我們通過key.equals()找到LinkedList中正確的節點。
如果HashMap的大小超過了負載因子?怎麼辦?
預設的HashMap裡面的負載因子大小是0.75,將會重新建立一個原來HashMap大小的
兩倍bucket陣列。
重新調整的話會出現什麼問題?
多執行緒情況下會出現競爭問題,因為你在調節的時候,LinkedList儲存是按照順序儲存,調節的時候回將原來最先儲存的元素(也就是最下面的)遍歷,多執行緒就好試圖重新調整,這個時候就會出現死迴圈。
為什麼要用String、Wrapper類,來作為鍵值對?因為他們一般不是不可變的,原始碼上面final,使用不可變類,而且重寫了equals和hashcode方法,避免了鍵值對改寫。提高HashMap效能。
使用CocurrentHashMap代替Hashtable?
可以,但是Hashtable提供的執行緒更加安全。