以面試的角度學習hashmap原理(面試官從淺到深必問的map八大問題)

網上資料太醜,漫無目的沒有針對性,學生不知道如何提煉重點。本人以面試官角度整理hashmap原理,以達到“目的性”學習

1.hashmap簡介(如下,數組-鏈表形式)

HashMap的存儲結構

以面試的角度學習hashmap原理(面試官從淺到深必問的map八大問題)

圖中,紫色部分即代表哈希表,hashmap也稱為哈希數組(默認數組大小是16,每對key-value鍵值對其實是存在map的內部類entry裡的),數組的每個元素都是一個單鏈表的頭節點,跟著的綠色鏈表是用來解決衝突的,如果不同的key映射到了數組的同一位置處,就將其放入單鏈表中

2.hashmap原理(即put和get原理)

2.1 put原理

1.根據key獲取對應hasn值:int hash = hash(key.hash.hashcode())

2.根據hash值和數組長度確定對應數組引int i = indexFor(hash, table.length); 其實就是i = hash值%模以 數組長度。如果不同的key都映射到了數組的同一位置處,就將其放入單鏈表中

2.2 get原理

1.獲得對應數組位置,遍歷該數組所在鏈表(key.equals())

3.hashcode相同,衝突怎麼辦?

放到對應的鏈表。

4.hashmap達到默認負載因子(0.75)怎麼辦?

自動雙倍擴容,擴容後重新計算每個鍵值對位置。

5. hashmap 和 hashtable 區別?

線程: 不安全 安全(synchronized修飾)

效率: 更高 略低

數組默認值: 16 11

null值: key-value都允許 不允許(拋異常)

其中key為null的map對象就在索引為0的位置上

6. hashmap 和 concurrenthashmap區別?

線程: 不安全 安全

7.為啥concurrenthashmap和hashtable都是線程安全,但是前者性能更高?

因為前者是用的分段鎖,根據hash值鎖住對應鏈表,當hash值不同時,使其能實現並行插入,效率更高

8.java7的hashmap和java8的hashmap的區別?

為了加快查詢效率(因為get()需要遍歷整張鏈表),而java8的hashmap引入了紅黑樹結構,當某一鏈表元素>8時,該鏈表就會轉成紅黑樹結構,從而改善查詢速度


已完結專題(關注後查看):

  • 【mysql優化專題】【HTTP協議】
  • 【架構技術專題】【多線程/池專題】

更新中專題(關注後查看):

  • 【dubbo專題】【dubbo源碼專題】
  • 【JVM專題】【HTTP協議專題】
  • 【設計模式專題】【高併發專題】
  • 【架構技術專題】【netty專題】
  • 【數據結構專題】【redis專題】


分享到:


相關文章: