一、Map接口的架構
Map接口的架構試圖如下:
01.png
①SortedMap接口繼承Map接口,NavigableMap接口繼承SortedMap接口,TreeMap實現NavigableMap接口;
SortedMap:
NavigableMap:
TreeMap:
②AbstractMap接口實現了Map接口,TreeMap同時也繼承了AbstractMap,HashMap和WeakHashMap繼承了AbstractMap;
AbstractMap:
HashMap:
WeakHashMap:
③HashMap繼承了Dictionary,並且實現了Map接口:
二、SortedMap、TreeMap、HashMap、HashTable的區別
1、SortedMap:是有序不可重複的,key值不可為空,value值可以為空;底層是TreeMap;線程不安全;
2、TreeMap:無序不可重複,key值不可為空,value值可以為空;底層是紅黑樹;線程不安全;
3、HashMap:無序不可重複;只有一個Key值可以為空,當key值為null的時候,其hashcode定為0,放在hash表的 第0個bucket中,value值可以為空;底層是Entry數組+鏈表+紅黑樹;線程不安全;
4、HashTable:無序不可重複,Key值和Value值不能為空,底層是Entry數組+鏈表+紅黑樹;線程安全;
三、HashMap的源碼解析
1、基本原理,HashMap的底層是由Entry數組+鏈表+紅黑樹構成,這樣設計的原理;當添加一個值計算出他的HashCode的時候,如果這個hashcode值已經存在,發生了hash碰撞,我們這裡使用拉鍊法來解決這個問題,即在已經存在的這個值後面拉出一個鏈表,但是當數據量非常大的時候,這個鏈表會非常長,當查詢一個值的話,會非常耗費時間,時間複雜度為O(n),因此在java1.8版本之後,當鏈表長度大於8的時候,會自動轉換為紅黑樹,當長度小於6的時候,又會從紅黑樹轉換為鏈表形態;
下面是添加的方法,同時還是HashSet的添加方法:
閱讀更多 果大爺的幸福生活 的文章