Java 高階-集合框架
類似 C++ 中的 STL 標準模板庫,Java 也在 java.util
包中封裝了一套常用資料結構及其演算法,稱為集合框架。所有的集合框架都包含如下內容:
- 介面:代表集合的抽象資料型別 ADT,如 Collection、List、Set、Map 等
- 實現(類):集合介面的具體實現,是可重複使用的資料結構,例如:ArrayList、LinkedList、HashSet、HashMap。
- 演算法:實現集合介面的物件裡的方法,可以執行一些有用的計算,例如:搜尋和排序。這些演算法具有多型性,相同方法在相似的介面上有著不同的實現。
除了集合,Java 的集合框架也定義了幾個 Map 介面和類。Map 裡儲存的是鍵/值對。儘管 Map 不是集合,但是它們完全整合在集合中。
集合框架概述
Java 集合框架分為兩大類:
- Map 鍵值對的集合,包括SortedMap
- Collection 元素的集合,包括Set(包括 SortedSet)、List、Queue
主要介面及常用的實現類
具體實現類,常用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等。
Collection 介面
常用方法
查詢方法
方法名 | 描述 |
---|---|
int size() | 返回集合中元素個數 |
boolean isEmpty() | 如果集合中沒有元素則返回 true |
boolean contains(Object obj) | 判斷物件是否在集合中 |
boolean containsAll(Collection c) | 判斷方法的接收者物件是否包含集合中的所有元素 |
修改方法
方法名 | 描述 |
---|---|
boolean add(Object obj) | 向集合中增加物件 |
boolean addAll(Collection<?> c) | 將引數集合中的所有元素增加到接收者集合中 |
boolean remove(Object obj) | 刪除物件 |
boolean removeAll(Collection c) | 將引數集合中的所有元素從接收者集合中刪除 |
boolean retainAll(Collection c) | 與 removeAll 方法相反,只保留引數集合中的所有元素 |
List 介面
有序列表,元素可重複。
實現類
- Vector
- ArrayList:儲存方式類似陣列,訪問速度快
- LinkedList:儲存方式類似連結串列,增刪速度快
Set 介面
無序集合,元素不可重複。
實現類
- HashSet
- TreeSet 樹集合
SortedSet 介面
特殊的有序 Set,元素升序排列,還增加了次序的相關操作。
Queue介面
FIFO 先進先出佇列。
實現類
- LinkedList:同時實現了 List 介面,先進先出
- PriorityList:按元素值排序的佇列
Map 介面
儲存鍵值對。需要同時指定鍵和值的型別 Map<k, v>
。
實現類
- HashMap
- TreeMap
SortedMap
特殊 Map,關鍵字升序排列。通常用於字典。
相關演算法
大多演算法用於 List,min 和max 可以用於所有集合物件。
排序演算法 sort
使 List 中的元素按照某種次序關係升序排列。
- 將元素按照自然次序排列,或者集合實現了 Comparable 介面
- 附加 Comparator 物件做引數,規定比較規則,可實現反序或特殊規則
亂序演算法 shuffle
可用於洗牌,每個次序出現的概率都是一樣的。
反序 reverse
二分查詢演算法 binarySearch
Arrays 類
需要引入 java.util.Arrays
。
常用方法:
方法 | 描述 |
---|---|
sort(type[] a) | 排序 |
binarySearch() | 二分查詢 |
equals(type[] a, type[] b) | 陣列比較 |
fill(type[] a, type val) | 陣列填充同一個值 |
asList(T… a) | 將陣列轉為 ArrayList |
基於動態陣列的型別
Vector (集合框架的遺留類,不建議使用,執行緒安全)和 ArrayList(非同步,效率高,建議用) :
- 實現了 Collection 介面
- 不能儲存基本資料型別,需要包在包裝類中
- 可以儲存同類型的物件
- 容量可以自動擴充
Java 提供了執行緒安全集合 java.util.concurrent
包,有序集、佇列,任何集合類通過使用同步包裝器可以變成執行緒安全的:
List<E> synchArrayList = Collections.synchronisedList(new ArrayList<E>());
遍歷實現了 Collection 介面的集合
- 通過 Enumeration (舊介面,不推薦使用)或 Iterator 介面(新介面,推薦)遍歷集合
- 通過增強的 for 迴圈遍歷集合
- 通過聚集操作遍歷集合,可以在篩選的同時過濾
Enumeration/Iterator
Java 中的許多方法(例如 elements())返回 Enumeration 型別的物件,而不是返回集合類物件。
Enumeration 介面不能用於 ArrayList 物件,Iterator 介面可用於 ArrayList 物件和 Vector 物件。
Iterator 介面遍歷物件的同時,可以刪除物件。常用方法有:
- hasNext():集合中是否還有下一個元素
- next():取集合的下一個元素
- remove():刪除集合中最後呼叫 next() 返回的元素,注意不是從 Iterator 類中刪除
示例:
import java.util.*;
class test {
public static void main(String[] args) {
String[] s = {"hello", "world", "haha"};
ArrayList al = new ArrayList<String> (java.util.Arrays.asList(s));
System.out.println("before: " + al);
Iterator it = al.iterator();
while(it.hasNext()) {
String tmp = (String)it.next();
System.out.println(tmp);
if (tmp.length() > 4) {
it.remove();
}
}
System.out.println("after: " + al);
}
}
輸出:
before: [hello, world, haha]
hello
world
haha
after: [haha]
Map 介面
Map 中儲存鍵值對,主要實現類是 HashMap。
常用的修改方法和查詢方法有:
示例:
import java.io.*;
import java.util.*;
class test {
public static void main(String[] args) {
String[] arr = {"hello", "world"};
Map m = new HashMap();
System.out.println(m.isEmpty() ? "empty map" : "not empty map");
m.put("one", "this is a string");
m.put("two", arr);
System.out.println(m.containsKey("one"));
System.out.println(m);
Iterator iter = m.entrySet().iterator();
while(iter.hasNext()) {
Map.Entry entry = (Map.Entry)iter.next();
System.out.println("next : "+ entry.getKey() +" - "+entry.getValue());
}
}
}
輸出:
empty map
true
{one=this is a string, two=[Ljava.lang.String;@659e0bfd}
next : one - this is a string
next : two - [Ljava.lang.String;@659e0bfd