基本概念
在Java當中,如果有一系列類專門用來存放其它類的對象,這個類就叫做容器,或者就叫做集合,集合就是將若干性質相同或相近的類對象組合在一起而形成的一個整體。
容器的內容是我們工作中必須要深入學習和掌握的,因此也是我們面試必問、必考的問題,重要性毋庸置疑。
容器的前身應該是數組,數組也是用於存放對象的,但是數組存在結構單一、功能簡單以及容量固定的問題,因此容器就誕生了。
容器與數組的區別與聯繫:
1、容器不是數組,不能通過下標的方式訪問容器中的元素
2、數組的所有功能通過Arraylist容器都可以實現,只是實現的方式不同
3、如果非要將容器當做一個數組來使用,通過toArraylist方法返回的就是一個數組
容器的大族譜
容器按照存放數據的特性主要分爲兩大類,Collection以及Map。
1. Collection
一個獨立元素的序列,這些元素都服從一條或多條規則。其中List必須按照插入的順序保存元素、Set不能有重複的元素、Queue按照排隊規則來確定對象的產生順序(通常也是和插入順序相同)
List:一個有序集合,可以包含重複元素。你可以通過它的索引來訪問任何元素。List更像長度動態變換的數組。
Set:一個不能包含重複元素的集合。這個接口對數學集合抽象進行建模,被用來代表集合,就如一副牌。
Queue:隊列是一種特殊的線性表,它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作。進行插入操作的端稱爲隊尾,進行刪除操作的端稱爲隊頭。隊列中沒有元素時,稱爲空隊列。
Deque:雙向隊列,同時支持在隊列的前後端插入和刪除。
2.Map
通過Key-Value的方式進行存儲,允許通過Key方式查找Value。
List族譜
List的主要實現類如下表
實現類 | 內部數據結構 | 是否併發安全 | 併發安全實現方式 |
---|---|---|---|
ArrayList | 數組 | 否 | N/A |
LinkedList | 雙向鏈表 | 否 | N/A |
Vector | 數組 | 是 | 同步方法 |
Stack | 數組/棧 | 是 | 同步方法 |
CopyOnWriteArrayList | 數組 | 是 | ReentrantLock |
Vector、Stack不推薦使用,單線程環境下推薦使用ArrayList,多線程環境下考慮CopyOnWriteArrayList(修改較多容易消耗大量內存,可以合併修改)或者使用Collections類的同步List靜態方法來轉換爲同步List。
Set 族譜
Set的主要實現類如下表
實現類 | 內部數據結構 | 是否有序 | 有序的方式 | 是否併發安全 | 併發安全實現方式 |
---|---|---|---|---|---|
HashSet | 內置對象HashMap | 否 | N/A | 否 | N/A |
LinkedHashSet | 內置對象LinkedHashMap | 是 | 按照添加順序有序 | 否 | N/A |
CopyOnWriteArraySet | 內置對象CopyOnWriteArrayList | 是 | 按照添加順序有序 | 是 | CopyOnWriteArrayList中是使用ReentrantLock保障併發安全 |
TreeSet | 內置對象TreeMap | 是 | 通過實現Comparable進行比較排序 | 否 | N/A |
ConcurrentSkipListSet | 內置對象ConcurrentSkipListMap | 是 | 通過實現Comparable進行比較排序 | 是 | ConcurrentSkipListMap中使用CAS保障併發安全 |
Queue族譜
Queue主要分爲兩大類,阻塞隊列BlockingQueue以及非阻塞隊列,具體實現類如下
實現類 | 內部數據結構 | 是否支持比較排序 | 有序的方式 | 是否併發安全 | 併發安全實現方式 |
---|---|---|---|---|---|
PriorityQueue | 數組 | 是 | 支持Comparable進行比較排序 | 否 | N/A |
ConcurrentLinkedQueue | 鏈表 | 否 | 默認添加順序 | 是 | CAS設計 |
LinkedBlockingQueue | 鏈表 | 否 | 默認添加順序 | 是 | ReentrantLock+Condition |
DelayQueue | 內置對象PriorityQueue | 是 | 支持Comparable進行比較排序 | 是 | ReentrantLock |
ArrayBlockingQueue | 數組 | 否 | 默認添加順序 | 是 | ReentrantLock+Condition |
LinkedTransferQueue | 鏈表 | 否 | 默認添加順序 | 是 | CAS設計 |
SynchronousQueue | 鏈表 | 否 | 默認添加順序 | 是 | CAS設計 |
PriorityBlockingQueue | 數組 | 是 | 通過實現Comparable進行比較排序 | 是 | ReentrantLock+Condition |
Map族譜
實現類 | 內部數據結構 | 是否支持比較排序 | 有序的方式 | 是否併發安全 | 併發安全實現方式 |
---|---|---|---|---|---|
HashMap | 數組+鏈表(解決Hash衝突)+紅黑樹 | 是 | 按hash值存儲 | 否 | N/A |
LinkedHashMap | HashMap基礎上加上存儲元素添加順序的鏈表 | 否 | 默認添加順序 | 否 | N/A |
IdentityHashMap | 數組 | 否 | 按hash值存儲 | 否 | N/A |
WeakHashMap | 數組+鏈表 | 否 | 按hash值存儲 | 否 | N/A |
TreeMap | 紅黑樹 | 是 | 支持Comparable進行比較排序 | 否 | N/A |
ConcurrentSkipListMap | 跳錶 | 是 | 支持Comparable進行比較排序 | 是 | CAS設計 |
ConcurrentHashMap | 同HashMap | 否 | 按hash值存儲 | 是 | CAS設計 |
EnumMap | 數組 | 否 | 枚舉類型下定義的值順序一致 | 否 | N/A |
HashTable | 數組+鏈表(解決Hash衝突) | 否 | 按hash值存儲 | 是 | 同步方法 |
Properties | 同HashTable | 否 | 按hash值存儲 | 否 | 同步方法 |
Map中HashMap、LinkedHashMap、ConcurrentHashMap使用的最多,HashTable不推薦使用,併發環境下效率較低且不支持Fail-Fast。