HashMap、HashSet、TreeMap、TreeSet、LinkedHashMap的數據結構以及適用場景

HashMap:

                 數組+鏈表+紅黑樹實現。通過hashcode映射方式,能更快的查詢。一般用於對健值對方式快速查詢的使用場景。但是線程不安全,線程的安全的話可以使用tableMap,但tableMap的鎖太重,因此可以使用ConcurretHashMap採取分段鎖的方式性能更搞。 HashMap無序,如果要有序遍歷的情況可以使用treeMap。

ConcurretHashMap:

            因爲HashMap的線程不安全和tableMap的性能不佳,因此採用ConcurretHashMap在用於性能安全場景更合適。

ConcurretHashMap採用的是CAS+synchronize的加鎖方式。即分段鎖(每個鎖只鎖住數組的對象,而不是整個數組或整個hashmap)。

HashSet: 

       HashSet是哈希表的結構但是無序的且不是健值對的形式,其底層還是用HashMap實現的,因爲HashMap的key就是不允許重複的,因此hashset的存入的value作爲hashmap的key,而value都是一個final的object對象。其實也就限制了hashmap的map能力。

在需要數據不能重複的使用場景用hashset適用不過了。

TreeMap :

    TreeMap也是可以健值對形式,底層是紅黑樹的結構,這樣可以保持他的有序。在需要有序的map場景再適用不過了。

TreeSet:

     底層是用TreeMap實現的樹的結構了。跟HashSet類似,也是限制了TreeMap的map能力,而繼承tree能力,將value作爲TreeMap的key來保證值的不重複能力。在需要排序,且值不能重複的場景比較適合

 

LinkedHashMap:
    LinkedHashMap相對於HashMap,增加了雙鏈表的結果(即節點中增加了前後指針),其他處理邏輯與HashMap一致,同樣也沒有鎖保護,多線程使用存在風險。LinkedHashMap保證了可以數據按照訪問順序或插入順序來操作。如android中LruCache就是運用了這個的LRU(近期最少使用算法),固定大小的LinkedHashMap,當超過閾值的時候就進行LRU進行刪除,以達到緩存的策略。DiskLruCache也是跟Lrucache類同,只不過是LruCache內存存儲的緩存策略,而DiskLruCache是在磁盤或外部存儲上的存儲緩存策略。

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