目錄
(一)一起學(xué) Java Collections Framework 源碼之 概述
(二)一起學(xué) Java Collections Framework 源碼之 AbstractCollection
JDK 中很多類 LZ 已經(jīng)使用了無數(shù)次,但認(rèn)認(rèn)真真從源碼級研究過其原理的還只占少數(shù),雖然從網(wǎng)上看過無數(shù)篇講解 Java 集合框架中各個類原理的文章,但從未看過源碼的 LZ 總有一種道聽途說的感覺。于是 LZ 決定將 JDK 中常用的模塊逐個深入到源碼中一探究竟,并將學(xué)習(xí)過程記錄下來與大家分享。
首先對 Java 集合框架(JCF, Java Collections Framework)有一個整體的認(rèn)識,來看圖1。
圖1 Java 集合框架圖(圖片來源于網(wǎng)絡(luò))
從 圖1 可以看出來,JCF 分為兩條主線,一條是以 java.util.Collection 接口為頂級接口的線性表結(jié)構(gòu),另一條是以 java.util.Map 為頂級接口的鍵值(K-V)映射結(jié)構(gòu)。
一、Collection
Collection 接口下分為 List(序列)、Set(去重序列)和 Queue(隊(duì)列),實(shí)現(xiàn)了此接口的數(shù)據(jù)結(jié)構(gòu)都是線性的。
1.List
List 是有序 collection。用戶可以精確控制每一個元素的位置,并可以像數(shù)組一樣通過索引(下標(biāo))來訪問元素。ArrayList、LinkedList、Vector、Stack 均實(shí)現(xiàn)了此接口,因此它們都是有序的數(shù)據(jù)結(jié)構(gòu)。
1) ArrayList 是使用數(shù)組實(shí)現(xiàn)的可變長度的有序的集合,它允許包含 null 元素,并且不是同步的(is not synchronized)。因此它的訪問速度比 LinkedList 高,但由于隨機(jī)插入、刪除動作需要移動元素,此時性能比 LinkedList 差。
2) Vector 與 ArrayList 幾乎相同,但此類是同步的(is synchronized)。
3) Stack 是基于 Vector 實(shí)現(xiàn)的棧結(jié)構(gòu),因此它具有后進(jìn)先出(LIFO)的特點(diǎn),并且它也是同步的(is synchronized)。
4) LinkedList 是對 List 接口的鏈表實(shí)現(xiàn),它不是使用數(shù)組來實(shí)現(xiàn)的,因此每個元素之間的存儲空間并不是連續(xù)的。它同樣允許包含 null 元素,并且不是同步的(is not synchronized)。基于鏈表實(shí)現(xiàn)的 LinkedList 迭代性能不如 ArrayList 高,但優(yōu)點(diǎn)是隨機(jī)插入、刪除元素的性能高于 ArrayList。
2.Set
Set 是不包含重復(fù)元素的 collection,且最多只允許包含一個 null 元素。由于 Set 無法保證有序,所以無法用索引來訪問元素(可以通過迭代器等方式來訪問元素)。
1) HashSet 是基于哈希表對 Set 接口的實(shí)現(xiàn)類,因此無法保證迭代順序。此類允許 null 元素,并且同樣不是同步的(is not synchronized)。
2) LinkedHashSet 與 HashSet 不同的是,它可以保證迭代順序。
3) TreeSet 會根據(jù)元素的自然順序或通過構(gòu)造函數(shù)指定的 java.util.Comparator 比較器進(jìn)行排序。此實(shí)現(xiàn)也不是同步的(is not synchronized)。
3.Queue
Queue 是隊(duì)列。圖1 中沒有將其子類畫出來,其實(shí)在 JCF 中實(shí)現(xiàn)了隊(duì)列的數(shù)據(jù)結(jié)構(gòu)還是比較多的,因?yàn)橹灰獌H可以從兩端訪問的線性表我們就可以認(rèn)為它是一個隊(duì)列了,所以將其它線性表作為隊(duì)列使用還是比較容易的。
1) ArrayDeque 是使用大小可變數(shù)組實(shí)現(xiàn)的雙端隊(duì)列,也可以把它當(dāng)做棧來使用,替代 java.util.Stack 類。此類不是同步的(is not synchronized)。
二、Map
Map 是用于存儲鍵值對的數(shù)據(jù)結(jié)構(gòu),重復(fù)的鍵(Key)會被覆蓋,但值(Value)是允許重復(fù)的。
1) HashMap 是基于哈希表的 Map 接口的實(shí)現(xiàn),因此無法保證映射的順序。它允許 null 作為 Key 和 Value,并且不是同步的(is not synchronized)。
2) LinkedHashMap 與 HashMap 的不同是,它的迭代順序是可預(yù)知的。
3) Hashtable 與 HashMap 的不同是,它是同步的(is synchronized),并且 Key 和 Value 不可以是 null。
4) TreeMap 會根據(jù)元素的自然順序或通過構(gòu)造函數(shù)指定的 java.util.Comparator 比較器進(jìn)行排序。此實(shí)現(xiàn)不是同步的(is not synchronized)。
關(guān)于 Map 往往我們存在幾個容易混淆的地方,一個認(rèn)為 Map 就是使用 hash 算法實(shí)現(xiàn)的,其實(shí)并非如此。讓我們產(chǎn)生此種認(rèn)知是因?yàn)槠綍r最常用的實(shí)現(xiàn)類是 HashMap 或 Hashtable,而 TreeMap 就不是采用 hash 算法實(shí)現(xiàn)的。
另一個認(rèn)為 HashSet 也是 Map 接口的實(shí)現(xiàn),其實(shí) Set 并非鍵值對存儲格式,所以怎么會實(shí)現(xiàn) Map 接口呢,只不過它與 HashMap 均采用了 hash 算法而已,不要混淆。
還有一個認(rèn)為 Map 都是無序的,其實(shí)也并非完全如此,LinkedHashMap 就是有序的。
如果你也對以上三點(diǎn)含糊不清,待與 LZ 共同學(xué)習(xí)完本系列的博文,就不會再對上面的東西產(chǎn)生混淆了,而是會對整個 JCF 有一個全新且清晰的認(rèn)識,各位加油。
作者:yuhuashi
出自:http://www.cnblogs.com/0xcafebabe
本作品采用知識共享署名-相同方式共享 3.0 中國大陸許可協(xié)議進(jìn)行許可。
歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接。
分類: Java
標(biāo)簽: JCF
0xCAFEBABE
關(guān)注 - 14
粉絲 - 87
0
0
? 上一篇:解決 meld 出現(xiàn) locale.setlocale(locale.LC_ALL,'') 失敗的問題
? 下一篇:(二)一起學(xué) Java Collections Framework 源碼之 AbstractCollection
posted on 2017-04-17 09:19 0xCAFEBABE 閱讀(226) 評論(0) 編輯 收藏
注冊用戶登錄后才能發(fā)表評論,請 登錄 或 注冊,訪問網(wǎng)站首頁。
【推薦】50萬行VC++源碼: 大型組態(tài)工控、電力仿真CAD與GIS源碼庫
【免費(fèi)】從零開始學(xué)編程,開發(fā)者專屬實(shí)驗(yàn)平臺免費(fèi)實(shí)踐!
最新IT新聞:
· 美國化學(xué)學(xué)會起訴Sci-Hub
· 三星電子二季度利潤有望創(chuàng)新高 芯片業(yè)務(wù)首次超英特爾
· 阿里推AliGenie開發(fā)者平臺 內(nèi)容和軟硬件開發(fā)商均可接入
· NVIDIA展示GPU多芯集成技術(shù):顯卡性能/流處理器數(shù)爆發(fā)
· 滴滴司機(jī)痛訴乘客:真皮后座被踩破 損失2千元
? 更多新聞...
最新知識庫文章:
· 小printf的故事:什么是真正的程序員?
· 程序員的工作、學(xué)習(xí)與績效
· 軟件開發(fā)為什么很難
· 唱吧DevOps的落地,微服務(wù)CI/CD的范本技術(shù)解讀
· 程序員,如何從平庸走向理想?
Powered by:
博客園
Copyright ? 0xCAFEBABE
<2017年7月> | ||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 |
---|---|---|---|---|---|---|
25 | 26 | 27 | 28 | 29 | 30 | 1 |
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 | 1 | 2 | 3 | 4 | 5 |
導(dǎo)航
統(tǒng)計(jì)
隨筆 - 119
文章 - 5
評論 - 102
引用 - 0
公告
時間在流失,還在等什么?
昵稱:0xCAFEBABE
園齡:6年6個月
粉絲:87
關(guān)注:14
搜索
常用鏈接
我的標(biāo)簽
隨筆分類(117)
隨筆檔案(119)
文章分類(4)
相冊(14)
積分與排名
積分 - 165070
排名 - 1351
最新評論
樓主在sigsetjmp例子遇到的問題是這樣的static void fun (void) 9 {10 // long long i = 0; // 這個賦初值 應(yīng)該拿到sigsetjmp......
--愛新覺羅玄燁
@0xCAFEBABE 用的是LZ例子里面的代碼,復(fù)制下來的。但是很奇怪的是,在一個機(jī)器上運(yùn)行,每次都只打一個a就掛死等待alarm到時退出了。換一個機(jī)器又會有50%的概率運(yùn)行結(jié)果正常,都是四核的CP......
--跑在路上
@跑在路上你應(yīng)該是出現(xiàn)死鎖了,調(diào)試的時候4個線程并不是并發(fā)執(zhí)行的,所以不會出現(xiàn)死鎖。如果在編寫多線程的程序時,發(fā)現(xiàn)正常運(yùn)行會卡住,而調(diào)試卻正常,這一般都是由于鎖使用不當(dāng)導(dǎo)致的。...
--0xCAFEBABE
LZ,請教下低9個例子中,打印4個線程dbcd的,為什么我在本地執(zhí)行的時候只打印一個a就不打了,然后就等待alarm到時退出了。但是在gdb下調(diào)試時,運(yùn)行又能正常的執(zhí)行?
--跑在路上
5. Re:(十二) 一起學(xué) Unix 環(huán)境高級編程 (APUE) 之 進(jìn)程間通信(IPC)
牛逼 給跪了
--Xiao九哥
閱讀排行榜
評論排行榜
推薦排行榜
http://www.cnblogs.com/0xcafebabe/p/6662949.html