本文參考自阿里孤盡老師的《碼出高效代碼》一書的第六章,為了節(jié)省大家學習時間,在這里對重要知識進行了總結,如果有知識點不明白的可以關注作者,找作者要相關的具體學習資料(免費送上)。
一些大公司面試總會問一些JAVA集合相關的知識,如ArrayList實現原理、HashMap實現原理等。所以作者準備做一個針對Java集合進行剖析的專題(后續(xù)幾篇文章會全部圍繞Java集合展開)。
本篇文章沒有對Java集合中的具體某個集合做詳細剖析,只是讓大家對Java集合有個宏觀把控,為后面的學習做鋪墊。
Java集合架構圖

Java集合框架圖
如上圖所示,框架圖主要分為兩大類,第一類是按照單個元素存儲的Collection,在繼承樹中List、Set及Queue都實現了Collection接口,第二類是按照Key-Value存儲的Map。以上兩類集合體系,無論在數據存取還是遍歷,都存在非常大的差異(圖中灰色代表早期線程安全的類,目前基本已棄用)。
List集合
List集合是線性數據結構的主要實現。常見List集合:ArrayList和LinkedList。
- ArrayList:容量可以改變的非線程安全集合。采用數組作為內部存儲方式,擴容時需要把原有數據復制到新數組中。支持快速隨機訪問,但是插入或刪除元素速度慢(這個過程可能需要移動其他元素)。
- LinkedList:雙向鏈表。插入和刪除元素速度比ArrayList更快,但是隨機訪問速度比較慢。實現了Queue接口(同時具備隊列和棧的性質)。優(yōu)點:可以將內存中零散的空間通過引用的方式關聯(lián)在一起,內存利用率高。
Queue 集合
Queue(隊列)是一種先進先出的線性數據結構,只允許在一端進行獲取操作,在另一端進行插入操作。如BlockingQueue(阻塞隊列)由于其FIFO和阻塞特性,在高并發(fā)場景下常常被作為Buffer(數據緩沖區(qū))使用。
Map 集合
Map集合是以Key-Value鍵值對作為存儲元素的哈希結構,Key按照某種哈希函數計算后是唯一的,Value則是可以重復的。Map提供了keySet()、values()、entrySet()三種視圖,分別用來查看所有key、value、鍵值對。常見Map集合:HashMap、HashTable、ConcurrentHashMap、TreeMap。
- HashMap:非線程安全,Key無序。
- HashTable:線程安全,Key無序。由于效率低,基本已被淘汰。
- ConcurrentHashMap:線程安全,Key無序。推薦多線程環(huán)境下使用。
- TreeMap:線程安全,Key有序。底層為樹結構,在添加新元素到集合中時,按照某種比較規(guī)則將其插入合適位置,保證插入的集合是有序的。
注:由于Map是哈希結構,在插入元素的時候會根據Key的哈希值匹配一個位置,不是按照插入順序排列的,所以在無特殊處理的情況下是無序的。
Set 集合
Set集合是不允許重復元素的集合類型。常見Set集合:HashSet、TreeSet、LinkedHashSet。
- HashSet: 內部使用HashMap實現,只是Value固定為一個靜態(tài)對象。
- TreeSet: 內部使用TreeMap實現。
- LinkedHashSet: 繼承自HashSet,內部使用鏈表維護元素插入順序。
最后,希望讀者通過本篇文章對Java集合有個整體認知,后續(xù)發(fā)布針對Java集合的使用規(guī)范,實現原理等層面進行剖析,讓大家徹底搞懂Java集合!!!
END