一、容器的分類
紅色虛線框:接口
綠色實線框:抽象類
黑色實線框:類
二、基本概念
Java容器類類庫的用途是“保存對象”,并將其劃分為兩個不同的概念:
- Collection,一個獨立元素的序列,這些元素都服從一條或多條規則。List必須按照插入的順序保存元素,而Set不能有重復元素。Queue按照隊列規則來確定對象嘗試的順序(通常與它們被插入的順序相同),雙端隊列是一個特例,它是隊列的子接口可以在兩端插入和刪除數據
- Map,一組成對的“鍵值對”對象,允許使用鍵來查找值。ArrayList允許你使用數字來查找值,因此在某種意義上講,它將數字與對象關聯在了一起。映射表允許我們使用另一個對象來查找某個對象,它也被稱之為“關聯數組”,因為它將某些對象與另外一些對象關聯在了一起,或者稱之為“字典”,因為你可以使用鍵對象來查找值對象,就像在字典中使用單詞來定義一樣。Map是強大的編程工具。
三、Collection接口
Collection接口是Set,Queue,List的父接口。Collection接口中定義了多種方法可供其子類進行實現,以實現數據操作。
Collection是描述所有序列容器的共性的根接口,它可能被認為是一個附屬接口,因為要表示其他若干個接口的共性而出現的接口。
3.1 相關方法
上圖中是Collection中的所有方法,但是在開發過程中核心使用的方法主要有增加、刪除,迭代等方法
其中重點是iterator()方法,該方法返回是迭代器,可以遍歷集合中元素
3.2 迭代器
任何容器類,都必須有某種方式插入元素并將它們再次取回。畢竟,持有事物是容器最基本的工作。
迭代器的概念可以用于一個目的:面向接口編程。如果面向具體的集合編程可能由于某些原先需要替換原來的集合,那么遍歷方法就需要重寫,如果采用迭代器就減少了一部分的工作量。
迭代器時一個對象,它的工作時遍歷并選擇序列中的對象,而客戶端程序員不需要只掉該序列的底層數據結構。
迭代器通常被稱為輕量級對象:創建它的代價小,因此可以見到對迭代器有些奇怪的限制。
3.2.1 迭代器相關API
3.2.2 與迭代器相關的操作
- 使用方法iterator()要求容器返回一個Iterator。Iterator將準備好返回序列的第一個元素。
- 使用next()獲得序列中的下一個元素。
- 使用hasNext()檢查序列中是否還有元素。
- 使用remove()將迭代器新近返回的元素刪除。remove元素之前必須先調用next(),因為remove移除的是新近返回的元素,如果沒有調用next()就沒有新近返回的元素。
3.2.3 Iterable
這個接口表示可迭代的,而且Collection接口繼承了該接口。這個接口在JDK1.5中加入。
ForEach語法可以應用于實現了Iterable接口的類。
API文檔
Implementing this interface allows an object to be the target of the "for-each loop" statement
實現此接口允許對象成為“for-each loop”語句的目標。
3.2.4 ListIterator
這個接口增加了一些方法,來適用于List相關的底層數據接口。
比如可以向前移動,修改等。
3.3 fail-fast機制,快速報錯機制
Java容器類類庫采用快速報錯機制。它會探查ConcurrentModificationException異常。就是快速報錯的意思。
這個機制主要是在迭代器中實現的。防止多線程在數據遍歷是進行修改。
四、List
- List承諾可以將元素維護在一個特定的序列中。List接口在Collection的基礎上添加了大量的方法,使得可以在List的中間插入和移除元素。
- List集合代表一個元素有序、可重復的集合,集合中每個元素都其對應的順序索引。
- List允許使用重復的元素,可以通過索引來訪問指定位置的集合元素。List默認按元素的添加順序設置元素的索引。
- List作為Collection接口的子接口,可以使用Collection接口里的全部方法。而且由于List是有序集合,因此List集合里增加了一些根據索引來操作集合元素的方法。
4.1 相關的API
4.2 ArrayList
它長于隨機訪問元素,但是在List的中間插入和移動元素時較慢
具體參考:集合-ArrayList解析
4.3 LinkedList
它通過代價較低的在List中間進行的插入和刪除操作,提供了優化的順序方法。LinkedList在隨機訪問方面相對比較慢,但是他的特性集較ArrayList更大
具體參考:集合-LinkedList解析
五、Set
5.1 相關的API
5.2 概述
存入Set的每一個元素都必須是唯一的,因為Set不保存重復元素。加入Set的元素必須定義equals()方法以確保對象的唯一性。Set與Collection有完全一樣的接口。Set接口不保證維護元素的次序。
具體參考:集合-Set解析
六、Queue
隊列是一個典型的先進先出的容器。即從容器的一段放入事物,從另一端取出,并且事物放入容器的順序與取出的順序是相同的。隊列常備當做一種可靠的將對象從程序中的某個區域傳輸到另一個區域的途徑。隊列在并發編程中特別重要
6.1 相關的API
6.2 PriorityQueue
先進先出描述最典型的隊列規則。隊列規則則是值在給定一組隊列中的元素的情況下確定下一個優先彈出隊列的元素的規則。先進先出聲明的下一個元素應該是等待時間最長的元素。
優先級隊列生命下一個彈出的元素時最需要的元素。
優先級隊列在隊列插入的時候根據Compartor(Comparable)進行排序。
具體參考隊列
6.3 Dueue,雙端隊列
支持兩端元素插入和移除的線性集合。
LinkedList實現了雙端隊列的API
6.4 ArrayDeque
默認長度是16的循環數組。
使用head和tail兩個int類型的字段來記錄數組的開始和結尾。
如果head和tail相等,那么就進行數據擴容,擴容是將數據copy到擴容后的數組,并且新數組中的數據是從0位置開始的。
七、Map
將對象映射到其他對象的能力是一種解決編程問題的殺手锏。
7.1 Map相關的API
7.2 具體實現及說明
實現 | 說明 |
---|---|
HashMap* | Map基于散列表的實現(它取代了Hashtable)。插入和查詢“鍵值對”的開銷是固定的??梢酝ㄟ^構造器設置容量和負載因子,以調整容器的性能。 |
LinkedHashMap | 類似于HashMap,但是迭代遍歷它是,取的“鍵值對”的順序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一點;而在迭代訪問時反而更快,因為它使用鏈表維護內部次序 |
TreeMap | 基于紅黑樹的實現。查看“鍵”或“鍵值對”是,他們會被排序(次序由Comparable或Comparator決定)。TreeMap的特點在于,所得到結果是經過排序的。TreeMap是唯一的帶有subMap()方法的Map,它可以返回一個子樹 |
WeakHashMap | 弱鍵(weak key)映射,允許釋放映射所指向的對象,這是為解決某類特殊問題而設計的。如果映射之外沒有引用指向某個“鍵”,則此“鍵”可以被垃圾收集器回收 |
ConcurrentHashMap | 一種線程安全的Map,它不涉及同步加鎖。 |
IndentityHahsMap | 使用==代替equals()對“鍵”進行比較的散列映射,專為解決特殊問題設計的。 |
八、工具類
8.1 Collections
處理集合相關的工具類
8.2 Arrays
處理數組的工具類
該類包含用于操作數組的各種方法(如排序和搜索)。 該類還包含一個靜態工廠,可以將數組視為列表。
參考
- 中文API文檔,該鏈接中有多個翻譯版本的API文檔
- Google翻譯的文檔
- 官方文檔
- 集合框架
其他文章
容器解析
ArrayList解析
LinkedList解析
TreeMap解析(上)
TreeMap解析(下)
HashMap解析
LinkedHasMap解析(下)
Set解析