目錄

(一)一起學(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。

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

圖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

好文要頂 關(guān)注我 收藏該文 大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn) 大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

0xCAFEBABE
關(guān)注 - 14
粉絲 - 87

+加關(guān)注

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í)踐!

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

最新IT新聞:
· 美國化學(xué)學(xué)會起訴Sci-Hub
· 三星電子二季度利潤有望創(chuàng)新高 芯片業(yè)務(wù)首次超英特爾
· 阿里推AliGenie開發(fā)者平臺 內(nèi)容和軟硬件開發(fā)商均可接入
· NVIDIA展示GPU多芯集成技術(shù):顯卡性能/流處理器數(shù)爆發(fā)
· 滴滴司機(jī)痛訴乘客:真皮后座被踩破 損失2千元
更多新聞...

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

最新知識庫文章:

· 小printf的故事:什么是真正的程序員?
· 程序員的工作、學(xué)習(xí)與績效
· 軟件開發(fā)為什么很難
· 唱吧DevOps的落地,微服務(wù)CI/CD的范本技術(shù)解讀
· 程序員,如何從平庸走向理想?

更多知識庫文章...

Powered by: 
博客園 
Copyright ? 0xCAFEBABE

<2017年7月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

導(dǎo)航

統(tǒng)計(jì)

  • 隨筆 - 119

  • 文章 - 5

  • 評論 - 102

  • 引用 - 0

公告


時間在流失,還在等什么?


大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)




昵稱:0xCAFEBABE
園齡:6年6個月
粉絲:87
關(guān)注:14

+加關(guān)注

搜索

 

 

常用鏈接

我的標(biāo)簽

隨筆分類(117)

隨筆檔案(119)

文章分類(4)

相冊(14)

積分與排名

  • 積分 - 165070

  • 排名 - 1351

最新評論

閱讀排行榜

評論排行榜

推薦排行榜

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

http://www.cnblogs.com/0xcafebabe/p/6662949.html