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碰撞後鍵值對象存儲問題。

發佈了38 篇原創文章 · 獲贊 16 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章