前言: 本文主要介紹了 Java 集合框架,讓大家對它有個概念的認識,為后面介紹資料結構以及集合框架中具體的實作類來做鋪墊,希望大家喜歡!
文章目錄
- 1. 介紹(含集合框架圖)
- 2. 各個介面概述
- 3. 各個實作類概述
- 4. Iterable
- 4.1 介紹
- 4.2 Iterator 和 ListIterator 迭代器
- 4.3 迭代器的簡單用法
- 5. Collection
- 5.1 介紹
- 5.2 Collection 介面說明
- 5.3 Collection 常用方法說明
- 5.4 Collection 示例
- 5.4.1 使用 Collection 創建集合
- 5.4.2 使用 Collection 內的方法
- 6. Map
- 6.1 介紹
- 6.2 Map 介面說明
- 6.3 Map 常用方法說明
- 6.4 Map 示例
- 6.4.1 使用 Map 創建圖
- 6.4.2 使用 Map 內的方法
- 7. 總結
1. 介紹(含集合框架圖)
什么是 Java 的集合框架呢?
Java 集合框架
Java Collection Framework,又被稱作容器container,是定義在java.util包下的一組介面和其實作類(使用時需要導包)它主要表現為將多個元素置于一個單元,用于對這些元素進行快速、便捷的存盤、檢索、管理,即平時我們俗稱的增刪改查
為了便于理解,個人制作了一個集合框架的圖片,并注明了一些注釋
- 配合這個圖我們可以看到集合框架其實就是一些介面和具體要實作的類,而這些具體要實作的類就是我們資料結構中要學習的那些鏈表、佇列、數、哈希表等等,不過 Java 底層已經實作了一些資料結構并封裝了起來,
- 并且我們從圖中可以看到,Java 集合框架主要包括兩種型別的容器,一種是集合(Collection),存盤一類元素的集合;另一種是圖(Map),存盤鍵/值對映射,而箭頭則代表著繼承的關系,
現在相信大家應該明白了,集合框架就是一個用來代表和操縱集合的統一架構,它就是由一些介面、實作類、和具體的演算法實作的,
2. 各個介面概述
對于上述框架圖中的一些介面,我在這簡單概述一下,后期會進行深入介紹,
| 介面 | 描述 |
|---|---|
Collection 介面 | Collection 是最基本的集合介面,一個 Collection 代表一組 Object,即 Collection 的元素,Java 不提供直接繼承自 Collection 的類,只提供繼承于的子介面(如 List 和 set ),Collection 介面存盤一組不唯一,無序的物件, |
List 介面 | List 介面是一個有序的 Collection,使用此介面能夠精確的控制每個元素插入的位置,能夠通過索引(元素在 List 中位置,類似于陣列的下標)來訪問 List 中的元素,第一個元素的索引為 0,而且允許有相同的元素,List 介面存盤一組不唯一,有序(插入順序)的物件, |
Queue 介面 | Queue 介面繼承自 Collection 介面,是 Java 中定義的一種佇列資料結構,元素是有序的(按插入順序排序),先進先出(FIFO)原則,不支持隨機訪問資料,新元素插入(offer)到佇列的尾部,訪問元素(poll)操作會回傳佇列頭部的元素,通常,佇列不允許隨機訪問佇列中的元素, |
Deque 介面 | Deque 介面是 Queue 介面的子介面,創建了雙端佇列結構,靈活性更強,可以前向或后向迭代,在隊頭隊尾均可插入或洗掉元素的線性集合,Deque 介面支持容量固定的雙端佇列,也支持容量不固定的雙端佇列,一般情況下,雙端佇列的容量是不固定的, |
Set 介面 | Set 具有與 Collection 完全一樣的介面,只是行為上不同,Set 不保存重復的元素,Set 介面存盤一組唯一,無序的物件, |
SortedSet 介面 | 繼承于Set保存有序的集合, |
Map 介面 | Map 介面存盤一組鍵值物件,提供key(鍵)到value(值)的映射, |
SortedMap 介面 | 繼承于 Map,使 Key 保持在升序排列, |
3. 各個實作類概述
對于上述框架圖中的一些實作類,我在這簡單概述一下,后期會進行深入介紹,
| 類名 | 描述 |
|---|---|
LinkedList | 該類實作了 List 介面,允許有 null(空)元素,主要用于創建鏈表資料結構,該類沒有同步方法,如果多個執行緒同時訪問一個 List,則必須自己實作訪問同步,解決方法就是在創建 List 時候構造一個同步的 List, |
ArrayList | 該類也是實作了 List 的介面,實作了可變大小的陣列,隨機訪問和遍歷元素時,提供更好的性能,該類也是非同步的,在多執行緒的情況下不要使用,ArrayList 增長當前長度的50%,插入洗掉效率低, |
Vector | 該類和 ArrayList 非常相似,但是該類是同步的,可以用在多執行緒的情況,該類允許設定默認的增長長度,默認擴容方式為原來的2倍, |
Stack | 堆疊是 Vector 的一個子類,它實作了一個標準的后進先出的堆疊, |
PriorityQueue | PriorityQueue 是 AbstractQueue 的子類,AbstractQueue 又實作了 Queue 介面,所以 PriorityQueue 具有 Queue 介面的優先佇列,優先佇列與普通佇列不同,普通佇列遵循“FIFO”的特性,獲取元素時根據元素的插入順序獲取,優先佇列獲取元素時根據元素的優先級,獲取優先級最高的資料, |
TreeSet | 該類實作了 Set 介面,可以實作排序等功能, |
HashSet | 該類實作了 Set 介面,不允許出現重復元素,不保證集合中元素的順序,允許包含值為 null 的元素,但最多只能一個, |
HashMap | HashMap 是一個散串列,它存盤的內容是鍵值對(key-value)映射,該類實作了Map 介面,根據鍵的 HashCode 值存盤資料,具有很快的訪問速度,最多允許一條記錄的鍵為 null,不支持執行緒同步, |
TreeMap | 繼承了 AbstractMap,并且使用一顆樹, |
4. Iterable
4.1 介紹
在集合框架的體系圖中,我們還有一點沒有介紹到,就是最上面的,被 Collection 繼承的 Iterable 介面,這就相當于所有的集合類都實作了 Iterable 介面,那么這個介面能干什么呢?
Iterable 由英文翻譯就是可迭代的意思, 當我們實作了這個介面時,我們就能稱這個類是一個”可數“類,也就是可以使用 Iterator 迭代器
4.2 Iterator 和 ListIterator 迭代器
什么是迭代器呢?
迭代器是確使用戶可在容器物件(container,如鏈表或陣列)上遍歷的物件,設計人員使用此介面無需關心容器物件的記憶體分配的實作細節,
一般遍歷陣列都是采用 for 回圈或者 for-each,這兩個方法也可以用在集合框架上,但是還有一種方法是采用迭代器的方式遍歷集合框架,它是一個物件,實作了
Iterator介面和ListIterator介面,使用了迭代器,能夠通過回圈來得到或洗掉集合的元素,
ListIterator繼承了Iterator,以允許雙向遍歷串列和修改元素
4.3 迭代器的簡單用法
迭代器 it 的兩個基本操作是 next、hasNext 和 remove
- 呼叫
it.next()會回傳迭代器的下一個元素,并且更新迭代器的狀態- 呼叫
it.hasNext()用于檢測集合中是否還有元素- 呼叫
it.remove()將迭代器回傳的元素洗掉
知道迭代器的基操后,我們從獲取迭代器開始學會簡單使用它
我們先創建一個集合,并添加幾個元素,創建集合的方式下文會介紹,
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("Jack");
arrayList.add("Tom");
arrayList.add("Helon");
獲取一個迭代器:
Iterator<String> it = arrayList.iterator();
輸出集合中的第一個元素:
System.out.println(it.next());
// 結果為:Jack
回圈集合元素:
while(it.hasNext()){
System.out.println(it.next());
}
洗掉元素:
ArrayList<Integer> arrayList = new ArrayList<>();
arrayList.add(1);
arrayList.add(3);
arrayList.add(5);
Iterator<Integer> it = arrayList.iterator();
while(it.hasNext()){
Integer i = it.next();
if(i<3){
it.remove();
}
}
System.out.println(arrayList);
// 結果為:[3,5]
注意:
Iterator 類位于 java.util 包中,使用前需要導包:
import java.util.Iterator
5. Collection
5.1 介紹
Collection 是最基本的集合介面,一個 Collection 代表一組 Object,即 Collection 的元素,Java 不提供直接繼承自 Collection 的類,只提供繼承于的子介面(如 List 和 set ),
Collection 介面存盤一組不唯一,無序的物件,
5.2 Collection 介面說明
如果想知道 Collection 介面具體的說明,可以直接百度,也可以點擊 Collection 官方檔案

5.3 Collection 常用方法說明
| 方法 | 說明 |
|---|---|
boolean add(E e) | 將元素 e 放入集合中 |
void clear() | 洗掉集合中的所有元素 |
boolean isEmpty() | 判斷集合是否沒有任何元素,即空集合 |
boolean remove(Object e) | 如果元素 e 出現在集合中,洗掉其中一個 |
int size() | 回傳集合中的元素個數 |
Object[] toArray() | 回傳一個裝有所有集合中元素的陣列 |
5.4 Collection 示例
5.4.1 使用 Collection 創建集合
如我們要創建一個元素是字串型別的順序表集合,就可以寫成:
Collection<String> collection1 = new ArrayList<>();
如果我們要創建一個元素是整形的堆疊集合,就可以寫成:
Collection<Integer> collection2= new Stack<>();
注意:
一般不直接用 Collection,而是直接實用具體實作類來創建物件,如
ArrayList<String> arrayList = new ArrayList<>();
<>中存放的是要存放內容型別的型別別,即包裝類
5.4.2 使用 Collection 內的方法
我們先創建一個集合
Collection<String> collection = new ArrayList<>();
對它進行增加元素
collection.add("hello");
回傳集合中的元素
System.out.println(collection.size());
洗掉集合中的所有元素
collection.clear();
回傳一個裝有所有集合元素的陣列
Object[] array = collection.toArray();
注意:
Object 型別陣列不能轉換成其他型別別陣列,如
Object[] o = {1,2,3}; Integer[] i = (Integer)o;這樣寫是錯誤的,這是由于 Java 當中,陣列不能整體進行轉化,
Object 型別的元素可以單個轉換成其他型別,如
Object o = 1; Integer i = (Integet)o;這個代碼是對的
6. Map
6.1 介紹
Map 介面存盤一組鍵值物件,提供key(鍵)到value(值)的映射,
6.2 Map 介面說明
如果想知道 Map 介面具體的說明,可以直接百度,也可以點擊 Map 官方檔案

6.3 Map 常用方法說明
| 方法 | 說明 |
|---|---|
V get(Object k) | 根據指定的 k 查找對應的 v |
V getOrDefault(Object k, V defaultValue) | 根據指定的 k 查找對應的 v,沒有找到就用默認值代替 |
V put(K key, V value) | 將指定的 k-v 放入 Map |
boolean containsKey(Object key) | 判斷是否包含 key |
boolean containsValue(Object value) | 判斷是否包含 value |
Set<Map.Entry<K, V>> entrySet() | 將所有的鍵值對回傳 |
boolean isEmpty() | 判斷是否為空 |
int size() | 回傳鍵值對的數量 |
6.4 Map 示例
6.4.1 使用 Map 創建圖
如我們要創建一個鍵是字串型別、值也是字串型別的哈希表集合,就可以寫成:
Map<String,String> map1 = new HashMap<>();
如我們要創建一個鍵是整形型別、值是字串型別的哈希表集合,就可以寫成:
Map<Integer,String> map2 = new HashMap<>();
6.4.2 使用 Map 內的方法
我們先創建一個圖:
Map<String,String> map = new HashMap<>();
將指定的 k-v 放入
map.put("點贊","感謝");
map.put("關注","超感謝");
map.put("收藏","十分感謝");
根據指定的 k 查找對應的 v
String v = map.get("收藏");
根據指定的 k 查找對應的 v,沒有找到就用默認值代替
String v = map.getOrDefault("三連","超級無敵感謝");
如果 map 中沒有"三連"這個鍵,將會用默認值"超級無敵感謝"來代替
將所有的鍵值對回傳
Set<Map.Entry<String, String>> entrySet=map.entrySet();
Set<Map.Entry<K, V>>這個型別的意思就在 Set 集合里面每個元素是Map.Enrty<K, V>型別,我們可以通過 for-each 回圈遍歷一下 entrySet 集合中的元素
for(Map.Entry<String,String> entry: entrySet){ System.out.println("key: "+entry.getKey()+" value: "+entry.getValue()); }
注意:
Map 中存盤的資料是無序的,如我們將上述 put 的代碼輸出 map 結果為
但是使用 put 存放元素的時候是有一個規則的,這個將在后面章節介紹
Map 中,key 可以重復,但是同一個 key 所對應的值只有一個,為最后你更新這個 key 的值
7. 總結

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/316632.html
標籤:其他
下一篇:程式的編譯

