先上圖:

一、自己了解
Java的集合類主要有List、Set和Map三大類,其中,List和Set是Collection接口一脈,Map接口自成一脈。
其中,還有兩個工具類Arrays和Collections
二、學習了解
1.List
List的特性是按順序插入,可重復,允許null值。實現List接口的集合主要有:ArrayList,LinkedList,Vector和Stack。
簡單地講一下:
ArrayList是動態數組,底層是數組,默認初始化大小是10,可以動態擴容1.5倍,線程不安全。適用於隨機訪問。
LinkedList底層是雙向鏈表,線程不安全。由於是雙向鏈表,訪問時需要從頭部或者尾部進行遍歷,適用於插入刪除比較多的操作
Vector底層也是數組,類似於ArrayList,但是它是線程安全的。
Stack是繼承Vector類的,實現了一個先進后出的棧結構,其中Stack提供了額外的5個方法。基本的push和pop操作,以及peek操作,empty方法判斷棧空,search方法檢測一個元素在棧中的位置。Stack剛創建后是一個空棧。
2.Set
Set的特性是無序,不可重復,允許null值但只允許一個。實現Set接口的集合主要有HashSet、TreeSet、EnumSet
HashSet底層是用HashMap實現的,用哈希表實現的(數組+鏈表)
TreeSet底層是用TreeMap實現的,用的是紅黑樹實現的。
3.Map
上面講的Collection叫做集合,Map叫做映射。如下圖:
圖來源Java3y
Map集合的特點:將鍵映射到值得對象,一個映射不能包含重復的鍵,每個鍵最多只能映射一個值。
Map與Collection的區別在於Map是以鍵值成對存儲的,鍵是唯一的,值是可以重復的;Collection集合存在元素是單獨的,其中Set是唯一的,List是可重復的。
要點在於Map針對鍵,Collection針對值。
三、 深入了解(基於JDK1.8)
1.LinkedList ArrayList Vector的區別
| 區別之處 |
ArrayList |
LinkedList |
Vector |
| 底層實現 |
基於動態數組 |
基於雙向鏈表 |
基於動態數組 |
| 初始容量 |
10 |
|
10 |
| 擴容大小 |
增長原數組大小的50% |
|
增長原數組大小的100% |
| 是否線程安全 |
不安全 |
不安全 |
安全 |
| 各自優點 |
適用隨機訪問,查詢效率比LinkedList和Vector高 |
插入速度快,適用於插入和刪除較多的操作。 |
查詢效率比ArrayList低,適用於數據量較大的數據 |
2.HashMap HashTable ConcurrentHashMap的區別
| 區別 |
HashMap |
HashTable |
ConcurrentHashMap |
TreeMap |
| 底層實現 |
數組+鏈表+紅黑樹 |
數組+鏈表 |
JDK1.7 ReentrantLock+Segment+HashEntry JDK1.8 Synchronized+CAS+Node+紅黑樹
|
紅黑樹 |
| 初始容量 |
16(2的n次冪) |
11 |
16 |
|
| 負載因子 |
0.75 |
0.75 |
0.75 |
|
| 擴容大小 |
原大小的2倍 |
原大小的2倍+1 |
原來的2倍 |
|
| 是否線程安全 |
不安全 |
安全 |
安全 |
不安全 |
| 各自特點 |
HashMap可以將空值作為一個表的條目的key或value |
已經過時 |
ConcurrentHashMap的key和Value都不能為null |
TreeMap中所有的元素都保持着某種固定的順序,如果你需要得到一個有序的結果你就應該使用TreeMap |
3.HashSet與HashMap TreeSet與TreeMap的關系
HashSet依賴HashMap

TreeSet依賴TreeMap

