1. 程式人生 > >hashmap底層實現原理以及常見的面試問題

hashmap底層實現原理以及常見的面試問題

hashmap演算法優劣標準
1.分佈均勻
2.儘量避免衝突

關於hashMap的幾個問題
1、hashing的概念
這個是一個hash演算法,將Key物件通過hashing的到需要儲存值物件的位置bucket。
2、HashMap中解決碰撞的方法
根據key的hashcode得到儲存位置bucket,有可能不同的key得到的位置一樣這樣就出現了hash碰撞。這樣就引入了每一個bucket中的一個連結串列結構來解決碰撞,hashMap如果發生hash碰撞則將鍵值物件存在連結串列的下一個節點。
3、equals()和hashCode()的應用,以及它們在HashMap中的重要性
當兩個不同的鍵物件的hashcode一樣,他們會儲存在同一個bucket位置的連結串列中,通過遍歷這個連結串列再根據鍵物件的equals方法用來找到存放在連結串列中的鍵值對(Entry)物件。get方法用到equals和hashcode方法,put則用到hashcode方法。

4、不可變物件的好處
用不可變物件作為key,是非常合適的。
1)如果存放時key物件的hashcode和獲取時這個key物件的hashcode不一致時則無法獲取值物件。
2)不可變物件是執行緒安全的,減少碰撞的機率。

5、HashMap多執行緒的條件競爭
當多個執行緒同時試圖去調整hashmap大小的時候,儲存在連結串列的中的元素會反過來,因為移動到新的bucket位置的時候,hashmap並不會將元素放到連結串列的尾部,而是放在頭部,這樣是為了避免尾部遍歷。這樣就可能發生死迴圈。
6、重新調整HashMap的大小
如果put元素之後發現hashmap的size>當前size*負載因子(預設0.75)時就會對hashmap進行擴0容。擴容過程是建立一個原來map大小的2倍bucket陣列,通過新的hash演算法將原來的Entry物件存放到新的bucket陣列中。這個過程是rehashing過程,這個是非常耗時的,因此在開發中儘量選定合適的初始hashMap大小,儘量減少擴容的發生。

7、hashMap底層資料結構到底是怎樣的
hashMap包含一個bucket陣列和每一個bucket對應的連結串列結構,每一個K-V物件存放在這個連結串列中,這個連結串列結構主要用來解決hash碰撞後鍵值物件儲存問題。