Java Collection集合
Collection【介面】
-
List【介面】:
- 特點: 有序集合,允許重複元素,可以透過索引訪問元素。
- 子類:
- ArrayList:
- 底層資料結構: 動態陣列。
- 效能特點:
- 查詢操作(如get(index))時間複雜度為O(1)。
- 增刪操作(如add, remove)時間複雜度為O(n),因為可能需要移動陣列中的元素。
- 執行緒安全: 不是執行緒安全的,如果需要在多執行緒環境下使用,需要額外的同步措施。
- 效率: 由於陣列的連續記憶體分配,它提供了較高的效率。
- Vector:
- 底層資料結構: 動態陣列。
- 效能特點:
- 與ArrayList類似,但所有公共方法都是同步的,因此是執行緒安全的。
- 效率: 由於同步,效率比ArrayList低。
- LinkedList:
- 底層資料結構: 雙向連結串列。
- 效能特點:
- 增刪操作(如add, remove)時間複雜度為O(1),因為不需要移動元素。
- 查詢操作(如get(index))時間複雜度為O(n),因為需要遍歷連結串列。
- 執行緒安全: 不是執行緒安全的,如果需要執行緒安全的連結串列,可以考慮使用
Collections.synchronizedList
包裝一個LinkedList。
- ArrayList:
-
Set【介面】:
- 特點: 不允許重複元素,主要用於儲存唯一元素的集合。
- 子類:
- HashSet:
- 底層資料結構: 雜湊表。
- 效能特點:
- 基於雜湊表實現,元素的新增、刪除和查詢操作時間複雜度為O(1)。
- 元素唯一性: 透過hashCode()和equals()方法來保證元素的唯一性。
- 執行緒安全: 不是執行緒安全的,需要額外同步措施。
- LinkedHashSet:
- 底層資料結構: 雜湊表和雙向連結串列。
- 效能特點:
- 繼承自HashSet,同時維護了一個雙向連結串列來記錄插入順序。
- 保持了HashSet的效能特點,同時提供了有序性。
- TreeSet:
- 底層資料結構: 紅黑樹。
- 效能特點:
- 元素自動排序,可以自定義排序規則。
- 插入、刪除和查詢操作的時間複雜度為O(log(n))。
- 元素唯一性: 透過比較器(Comparator)或元素的自然排序(Comparable)來保證。
- HashSet:
示例程式碼
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.TreeSet;
public class CollectionExample {
public static void main(String[] args) {
// ArrayList 示例
List<String> arrayList = new ArrayList<>();
arrayList.add("Apple");
arrayList.add("Banana");
System.out.println(arrayList.get(0)); // 輸出: Apple
// LinkedList 示例
List<String> linkedList = new LinkedList<>();
linkedList.add("Orange");
linkedList.add("Mango");
linkedList.addFirst("Grape"); // 在開頭新增元素
System.out.println(linkedList.peek()); // 輸出: Grape
// HashSet 示例
Set<String> hashSet = new HashSet<>();
hashSet.add("Apple");
hashSet.add("Banana");
System.out.println(hashSet.contains("Apple")); // 輸出: true
// LinkedHashSet 示例
Set<String> linkedHashSet = new LinkedHashSet<>();
linkedHashSet.add("Orange");
linkedHashSet.add("Mango");
System.out.println(linkedHashSet); // 輸出: [Orange, Mango]
// TreeSet 示例
Set<String> treeSet = new TreeSet<>();
treeSet.add("Apple");
treeSet.add("Banana");
System.out.println(treeSet); // 輸出: [Apple, Banana],已排序
}
}
總結
- List 介面提供了有序集合的實現,支援透過索引訪問元素,適合需要保持元素順序的場景。
- Set 介面保證集合中元素的唯一性,適合需要去除重複元素的場景。
- ArrayList 和 LinkedList 提供了List介面的兩種不同實現,各有優勢,選擇時需考慮操作型別和效能需求。
- HashSet 和 LinkedHashSet 提供了Set介面的兩種不同實現,其中LinkedHashSet保持了元素的插入順序。
- TreeSet 提供了自動排序的Set實現,適合需要對元素進行排序的場景。
Java Map集合
Map【介面】
-
概述:
- 元素構成: Map集合中的元素是由鍵值對(key-value pairs)構成的。
- 用途: 用於儲存鍵值對映關係,透過鍵可以快速檢索到對應的值。
-
子類:
- HashMap:
- 特點:
- 底層資料結構: 雜湊表。
- 唯一性: 鍵是唯一的,不允許重複。
- 排序: 無序的,不保證元素的順序。
- 執行緒安全: 不是執行緒安全的,如果需要執行緒安全的Map,可以使用
Collections.synchronizedMap
方法或ConcurrentHashMap
。 - 效能: 查詢、插入和刪除操作的平均時間複雜度為O(1),但最壞情況下可能退化為O(n)。
- 特點:
- TreeMap:
- 特點:
- 底層資料結構: 紅黑樹。
- 唯一性: 鍵是唯一的,不允許重複。
- 排序: 根據鍵的自然順序或構造時提供的Comparator進行排序。
- 執行緒安全: 不是執行緒安全的,如果需要執行緒安全的TreeMap,可以考慮使用
Collections.synchronizedSortedMap
方法。 - 效能: 插入、刪除和查詢操作的時間複雜度為O(log(n))。
- 特點:
- HashMap:
-
特點:
- 唯一性和排序: Map集合中唯一性和排序都是針對鍵來說的。鍵是唯一的,而值可以發生重複。
- 鍵的唯一性: 在Map集合中,每個鍵只能對映到一個值,不能有重複的鍵。
- 值的重複性: 一個值可以對應多個鍵,即值可以重複。
示例程式碼
import java.util.HashMap;
import java.util.TreeMap;
import java.util.Map;
public class MapExample {
public static void main(String[] args) {
// HashMap 示例
Map<String, Integer> hashMap = new HashMap<>();
hashMap.put("Apple", 1);
hashMap.put("Banana", 2);
System.out.println(hashMap.get("Apple")); // 輸出: 1
// TreeMap 示例
Map<String, Integer> treeMap = new TreeMap<>();
treeMap.put("Orange", 3);
treeMap.put("Mango", 4);
System.out.println(treeMap); // 輸出: {Mango=4, Orange=3},已排序
}
}
總結
- Map 介面儲存鍵值對,鍵是唯一的,而值可以重複。
- HashMap 提供了基於雜湊表的快速鍵值對儲存,但不保證元素的順序。
- TreeMap 透過紅黑樹實現,可以對鍵進行排序,適用於需要有序鍵集合的場景。
- 選擇合適的Map實現取決於具體需求,如是否需要排序、是否需要執行緒安全等。
Java 增強for迴圈,泛型和可變引數詳細筆記
增強for迴圈
- 使用場景:
- 只能用於陣列和實現了Collection
介面的集合型別(如List
,Set
等)。 - 語法:
java for(元素型別 變數名 : 陣列名|Collection集合名){ 使用變數名; }
靜態匯入
- 語法:
java import static <引用資料型別>.*;
- 用途:
- 允許直接使用靜態成員(如靜態方法和靜態變數)而不需要類名作為字首。
泛型
- 泛型類:
- 允許在類宣告時定義型別引數,使得類的例項化可以接受不同的資料型別。 - 泛型方法:
- 在方法宣告時定義型別引數,使得方法可以處理不同的資料型別,而與類的型別引數無關。 - 泛型介面:
- 定義時可以包含型別引數,使得實現該介面的類可以指定型別引數。
高階使用
- 萬用字元:
-<? extends E>
: 表示型別引數是E
或E
的子類。
-<? super E>
: 表示型別引數是E
或E
的父類。 - 用途:
- 提供了更靈活的泛型使用方式,尤其是在處理繼承關係中的型別時。
可變引數
- 語法:
java xxxXxx(資料型別...引數名)
- 特點:
- 可變引數允許在呼叫方法時傳入任意數量的引數(包括零個)。 - 注意事項:
- 定義方法引數時,可變引數必須放在引數列表的最後。
- 可變引數在方法內部被當作陣列處理。
示例程式碼
import java.util.ArrayList;
import java.util.List;
public class GenericAndVarargsExample {
// 泛型方法示例
public static <T> void printList(List<T> list) {
for (T element : list) {
System.out.println(element);
}
}
// 可變引數示例
public static void printNumbers(int... numbers) {
for (int number : numbers) {
System.out.print(number + " ");
}
}
public static void main(String[] args) {
List<String> stringList = new ArrayList<>();
stringList.add("Hello");
stringList.add("World");
printList(stringList); // 輸出: Hello World
printNumbers(1, 2, 3, 4, 5); // 輸出: 1 2 3 4 5
}
}
總結
- 增強for迴圈 提供了一種簡潔的方式來遍歷陣列和集合,但僅限於這些型別。
- 靜態匯入 允許直接使用靜態成員,簡化程式碼,但需謹慎使用以避免命名衝突。
- 泛型 提供了編譯時型別安全檢查和消除型別轉換的功能,是處理集合和演算法時的強大工具。
- 萬用字元 在泛型中用於更靈活地處理型別關係,尤其是在方法引數中。
- 可變引數 允許方法接受不定數量的引數,極大地提高了方法的靈活性和易用性。
Java Collections工具類筆記
Collections【工具類】
-
概述:
-Collections
是Java提供的一個工具類,它包含了一系列靜態方法,用於對集合進行操作,如排序、搜尋、反轉等。 -
成員方法:
- sort(Listlist) :
- 對指定的列表進行排序。
- binarySearch(List list, T key)**: - 使用二分搜尋演算法搜尋指定列表,以獲得指定物件。 - **max(Collection coll):
- 返回給定集合中的最大元素。
- reverse(List list)**: - 反轉指定列表中元素的順序。 - **shuffle(List list):
- 使用預設的隨機源隨機排列指定的列表。
將不安全的集合變成安全的
- synchronizedCollection(Collection
c) :
- 返回由指定集合支援的同步(執行緒安全)集合。 - synchronizedList(List
list) :
- 返回由指定列表支援的同步(執行緒安全)列表。 - synchronizedMap(Map<K,V> m):
- 返回由指定地圖支援的同步(執行緒安全)對映。 - synchronizedSet(Set
s) :
- 返回由指定集合支援的同步(執行緒安全)集。
示例程式碼
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class CollectionsExample {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(3);
list.add(1);
list.add(2);
// 排序
Collections.sort(list);
System.out.println(list); // 輸出: [1, 2, 3]
// 反轉
Collections.reverse(list);
System.out.println(list); // 輸出: [3, 2, 1]
// 二分搜尋
int index = Collections.binarySearch(list, 2);
System.out.println("Index of 2: " + index); // 輸出: Index of 2: 1
// 同步集合
List<Integer> syncList = Collections.synchronizedList(list);
// 注意:同步集合是執行緒安全的,但迭代器不是
// 如果需要迭代器,使用迭代器的synchronizedList方法
}
}
總結
- Collections 類提供了許多靜態方法,用於對集合進行操作,如排序、搜尋、反轉等,極大地簡化了集合操作。
- 透過
Collections
類提供的同步方法,可以將普通的集合轉換為執行緒安全的集合,適用於多執行緒環境。 - 使用
Collections
類中的方法時,需要注意執行緒安全問題,特別是在迭代集合時。