1、HashMap、CurrentHashMap、LinkedHashMap、TreeMap

1、HashMap jdk1.7和1.8中的區別

  1. 底層數據結構不一樣,1.7中使用數組+鏈表,1.8使用數組+鏈表+紅黑樹。
    數組默認大小爲16,負載因子爲0.75,如果HashMap的size大於16*0.75就要擴容了,擴容方式爲創建一個新數組,大小爲16乘以2,然後重新rehash操作;
    1.8中當鏈表長度大於8(默認值)時採用紅黑樹,紅黑樹是一種自平衡二叉樹,能夠防止所有節點在同一側(線性結構),從而提高查詢性能(線性結構跟鏈表差不多,時間複製度O(n)),紅黑樹如何判斷是左節點還是右節點,需要key實現Comparable接口;

  2. 插入鏈表時不同,1.7中待插入節點總是插入鏈表的頭部,1.8中則是插入鏈表的表尾。
    1.7在多線程環境下擴容時會存在死循環情況,究其原因就是1.7中把節點插入到鏈表頭部,如:鏈表A->B->C,第一次擴容時應該是C->B->A,如果在變成B->A時又有一個線程擴容,那麼就可能出現A->B,這樣就出現AB死循環了;
    1.8則不會出現以上死循環情況,因爲它總是插入鏈表表尾,順序永遠都是A->B->C;

  3. 根據key的hashcode求數組下標時算法不一樣,內部大量應用位操作(左移、右移、&等等),位操作更快,性能更好。
    1.7更加複雜,因爲它需要儘可能避免哈希衝突,哈希衝突多了鏈表就長了,鏈表的查詢性能很差(依賴鏈表節點個數);
    1.8因爲使用了紅黑樹,所以衝突也無所謂,不影響查詢性能,沒有1.7複雜;

  4. 1.7中節點對象使用Entry表示,1.8使用Node表示,差不多一樣,屬性有key、value、hash、next,紅黑樹使用TreeNode表示。

  5. 都是線程不安全的。

2、CurrentHashMap jdk1.7和1.8中的區別

  1. 都是線程安全的。

  2. 除了HashMap說明的,下面主要針對加鎖不同進行說明。
    1.7中引入Segment概念,分段加鎖,一個segment對應幾個數組節點,segment數組個數受CurrentHashMap中的concurrencyLevel值決定(默認爲16),數組的默認值也爲16,所以一個segment對應一個數組節點,segment繼承RereentLock,存儲了對應數組節點的信息;
    1.8去掉Segment,直接對數組節點元素進行加鎖,這樣的好處是不用額外維護segment數組了(擴容時segment會變化);

3、LinkedHashMap與HashMap區別
LinkedHashMap繼承於HashMap,是基於HashMap和雙向鏈表來實現的,LinkedHashMap同樣是線程不安全的;

HashMap遍歷(keySet、entrySet)時是無序的,LinkedHashMap遍歷時是有序的,
LinkedHashMap默認按插入順序遍歷,如果需要按訪問順序遍歷則構造LinkedHashMap時指定accessOrder爲true,new LinkedHashMap<>(16, 0.75f, true);

在HashMap的構造函數中,調用了init方法,而在HashMap中init方法是空實現,但LinkedHashMap重寫了該方法,所以在LinkedHashMap的構造方法裏,調用了自身的init方法,LinkedHashMap中的Entry對象多了before、after的Entry對象,這個雙向鏈表是實現有序遍歷的關鍵;

    @Override
    void init() {
        // 創建了一個hash=-1,key、value、next都爲null的Entry
        header = new Entry<>(-1, null, null, null);
        // 讓創建的Entry的before和after都指向自身,注意after不是之前提到的next
        // 其實就是創建了一個只有頭部節點的雙向鏈表
        header.before = header.after = header;
    }

在這裏插入圖片描述
4、TreeMap
TreeMap中的元素默認按照key的自然排序排列。
(對Integer來說,其自然排序就是數字的升序;對String來說,其自然排序就是按照字母表排序)

不使用默認的自然排序
TreeMap(Comparator comparator):創建一個空TreeMap,按照指定的comparator排序。
TreeMap能便捷的實現對其內部元素的各種排序,但其一般性能比前兩種map差。

底層實現紅黑樹。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章