根據數據結構總結jdk常見的非併發容器,小結。
數據結構
基於數組
ArrayList
ArrayDeque(循環數組)
- 只需要雙端隊列效果時使用,比linkedList還要快
- 不提供索引方法
- 判斷元素存不存在需遍歷 效率低
EnumMap
- 特殊的 專門提供給鍵爲enum使用的map
- 數組的索引和枚舉的ordinal對應,get方法直接是先把枚舉的ordinal獲取到然後從數組裏面獲取值。
基於鏈表
應用場景: 要求有序,兩端訪問情況多
LinkedList
- 可作隊列(雙端隊列)
- 可作List
基於hash(數組+鏈表(紅黑樹))
應用場景:不需要重複元素,隨機訪問
hashMap
- 在併發操作中擴容操作容易形成環,引起死循環,應當使用併發容器ConcurrentHashMap
hashSet
基於排序二叉樹
應用場景:需要有序
- TreeMap
- TreeSet
基於鏈表+hash
應用場景:需要實現訪問排序
- LinkedHashMap
- LinkedHashSet
基於位向量
EnumSet
- 原理: 使用long 64位 保存枚舉集合,二進制中的一個位表示一個元素的兩種狀態,0表示不包含該枚舉值,1表示包含該枚舉值。
- 兩個實現RegularEnumSet(一個long保存數據),JumboEnumSet(long數組保存)
BitSet
- 可以方便地對指定位置的位進行操作,與其他位向量進行位運算。
- 原理:內部使用long數組存儲位向量,構造函數傳入需要構造的位向量的位數。
基於堆(完全二叉樹)
概念
- 要求最後一層不一定是滿的,但要求最後一層幾點從左到右是連續的,不能間隔
- 種類 分爲最大堆(根節點的值最大)與最小堆(根節點的值最小)
- 存儲結構 數組,因爲堆是完全二叉樹,所以每個節點的位置可以對應數組的下標
PriorityQueue
- 優先級隊列
- 單端隊列
- 應用:實時求中間值,實時求最大或最小值,優先級任務隊列。