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