Java集合框架概述

前言

Java集合框架概述; 主要總述Java集合框架的設計理念, 組成和基本接口(及其區別等)

博客同步至個人博客


正文


一. 設計理念

  1. 在Java 2之前,Java是沒有完整的集合框架的。它只有一些簡單的可以自擴展的容器類,比如Vector,Stack,Hashtable等)

  2. Java集合其實就是一組對象的集合

  3. 獨立于實現細節, 方便重用, 保證向下兼容(即保留了Vector等舊的API)

  4. 加強了API之間的互通信, 減少了新API的學習: 提供盡量統一的接口


二. 基本組成

2.1 總述

Java集合框架主要分為三個部分: 接口, 實現和算法

2.1-1 接口

接口指的是以CollectionMap為起始的一系列公用接口

實際上從Map出發的并不是真正的集合, 只是其包含集合視圖操作, 所以也將其歸入集合框架中

Collection出發的公用接口主要有以下幾個, 也是這次會著重講解和比較的; 當然, 下面的接口并不全面, 在后面會逐漸擴展和補充

Collection基本接口.png

Map出發的公用接口如下

Map基本接口.png

當然, 上述列舉出來的子接口都是直接繼承自Collection或者Map, 對于其子接口的子接口, 這里并沒有列出在這里(比如NavigableMap接口是SortedMap接口的子接口, 而不是直接繼承Map的, 所以這里并沒有直接列出來)

2.1-2 實現

實現指的是接口的實現類, 這里筆者在官網找到一張表, 如下, 很好的列出了平時重點所用的實現類

Interface Hash Table Resizable Array Balanced Tree Linked List Hash Table + Linked List
Set HashSet TreeSet LinkedHashSet
List ArrayList LinkedList
Deque ArrayDeque LinkedList
Map HashMap TreeMap LinkedHashMap

當然, 還應該包含Java 2以前幾個舊API, 即: Vector, Stack, Hashtable

2.1-3 算法

(1). 算法

算法指的是以Collections為主的提供的一系列對集合的操作, 參見下圖, 列出了其提供的常用算法

Collections方法.png

下面對上述方法進行一些簡單解釋

  1. sort(List): 使用歸并排序, 保證NlogN的時間復雜度和穩定性

  2. binarySearch(List, Object): 在一個有序的List中使用二分查找

  3. reverse(List): 逆轉List

  4. shuffle(List): 將List中的元素隨機重排

  5. fill(List, Object): 使用指定值(Object)覆蓋List中所有元素

  6. copy(List dest, List src): 拷貝

  7. min(Collection): 返回最小值

  8. max(Collection): 返回最大值

  9. rotate(List list, int distance): 將List中元素旋轉指定distance

  10. replaceAll(List list, Object oldVal, Object newVal): 將List中出現的所有oldVal替換為newVal

  11. indexOfSubList(List source, List target): 返回source中與target匹配的第一個子項的首元素索引

  12. lastIndexOfSubList(List source, List target): 返回最后一個匹配子項的首元素索引

  13. swap(List, int, int): 交換指定位置的兩個元素

  14. frequency(Collection, Object): 找出指定元素出現次數

  15. disjoint(Collection, Collection): 判斷兩個集合是否包含相同元素(即集合是否相交)

  16. addAll(Collection<? super T>, T...): 將指定元素添加到指定集合中

(2). 包裝類

當然, 實際上Collections提供的不僅僅是針對集合的算法, 其還提供了一系列對集合的包裝類(即Wrapper), 主要包括以下三大類:

  1. Collections.unmodifiableInterface(): 返回一個不可修改的集合, 包括UnmodifiableCollection, UnmodifiableSet, UnmodifiableList; 實現原理是在修改集合的操作上(如add(), remove()等)拋出異常

  2. Collections.synchronizedInterface(): 返回一個線程安全的集合, 包括SynchronizedCollection, SynchronizedSet, SynchronizedList; 實現原理是在需要同步的方法上添加synchronized限制

  3. Collections.checkedInterface(): 返回一個類型檢查的集合, 包括CheckedCollection, CheckedQueue, CheckedSet, CheckedList; 實現原理是在add()的時候進行類型檢查, 如果是非法類型, 就拋出異常ClassCastException; 這里的類型檢查實際上是使用Class.isInstance()來檢查的, 關于該方法和instanceof運算符的區別, 參見博客; (大致上, 二者是等價的, 只是isInstance()是在運行時才進行類型檢查, 故可用于反射, 泛型;
    但是instanceof需要在編譯時知道類的具體類型(重點理解在動態等價))

這些包裝類的作用主要是滿足平時一些特殊的需求, 比如同步, 不可修改等


三. 基本接口

在這一節, 主要講解上面提到的幾個基本接口, 這里不會涉及到其實現類

3.1 Collection

Collection是集合框架中一個最頂層的基本接口, 提供了一個數據集的基本描述, 在官方API中并沒有提供其直接實現類, 而是在其基礎上提供了進一步的限制接口, 即List, Set, Queue; 這樣做的好處有:

  1. 代碼復用: 從面向對象的角度講, 抽取出一個頂級接口, 有助于用戶代碼復用, 即編寫一個接口, 實現不同傳參(Collection的各種實現類), 實際上也是利用了多態(官方文檔的解釋是: 實現最大通用性)

  2. 易于擴展: 符合面向對象的思想, 即將數據集抽象, 通過不同的需求對其實現不同方便的限制, 易于擴展; 同時減少新API學習成本

Collection提供了數據操作的基本方法, 如add(), remove(), size(), clear()等; 同時, 其還繼承了Iterable接口, 這個接口是用于使用迭代器遍歷集合用的, 使用迭代器遍歷集合的優點是我們不必知道集合的內部結果,集合的內部結構、狀態由Iterator來維持, 通過統一的方法hasNext(), next()來判斷和獲取下一個元素

3.2 List

ListCollection上做的限制是, 元素有序(但并不是排序), 允許重復元素; 同時還將迭代器換成了ListIterator; 關于ListIterator, 其允許雙向的迭代, 以及元素插入(ListIterator.add()), 刪除(ListIterator.remove())和替換ListIterator.set()

JDK9中, 還提供了一個List.of()的靜態方法, 用于返回一個不可變List(Immutable List)

3.3 Set

SetCollection上做的限制是, 元素不重復, 至多一個null元素

JDK9中, 還提供了一個Set.of()的靜態方法, 用于返回一個不可變的Set

3.4 Queue

QueueCollection上做的限制是, 除了Collection提供的基本操作外, 還提供了一些額外的操作, 分為兩類, 一個返回特定值, 另一個拋出異常, 見下表

Throw Exception Return Special Value
Insert add(e) offer(e)
Remove remove() poll()
Examine element() peek()

3.5 Map

Map本質上是一組鍵值對, Map允許單獨訪問key(通過keySet()返回keySet), 也可以單獨訪問value(通過values()方法返回valueCollection), 也可以通過entrySet()獲取key-value的對應關系

四. 參考鏈接

  1. 官方文檔--集合框架指南

  2. 集合框架的分類

  3. 集合框架設計理念答疑文檔

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,362評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,577評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,486評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,852評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,600評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,944評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,944評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,108評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,652評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,385評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,616評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,111評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,798評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,205評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,537評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,334評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,570評論 2 379