網上資料太醜,漫無目的沒有針對性,學生不知道如何提煉重點。本人以面試官角度整理hashmap原理,以達到“目的性”學習
1.hashmap簡介(如下,數組-鏈表形式)
HashMap的存儲結構
圖中,紫色部分即代表哈希表,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專題】
閱讀更多 java進階架構師 的文章