六,Java集合

bjynjj發表於2024-10-15

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。
  • Set【介面】:

    • 特點: 不允許重複元素,主要用於儲存唯一元素的集合。
    • 子類:
      • HashSet:
        • 底層資料結構: 雜湊表。
        • 效能特點:
          • 基於雜湊表實現,元素的新增、刪除和查詢操作時間複雜度為O(1)。
          • 元素唯一性: 透過hashCode()和equals()方法來保證元素的唯一性。
          • 執行緒安全: 不是執行緒安全的,需要額外同步措施。
      • LinkedHashSet:
        • 底層資料結構: 雜湊表和雙向連結串列。
        • 效能特點:
          • 繼承自HashSet,同時維護了一個雙向連結串列來記錄插入順序。
          • 保持了HashSet的效能特點,同時提供了有序性。
      • TreeSet:
        • 底層資料結構: 紅黑樹。
        • 效能特點:
          • 元素自動排序,可以自定義排序規則。
          • 插入、刪除和查詢操作的時間複雜度為O(log(n))。
          • 元素唯一性: 透過比較器(Comparator)或元素的自然排序(Comparable)來保證。

示例程式碼

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 介面保證集合中元素的唯一性,適合需要去除重複元素的場景。
  • ArrayListLinkedList 提供了List介面的兩種不同實現,各有優勢,選擇時需考慮操作型別和效能需求。
  • HashSetLinkedHashSet 提供了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))。
  • 特點:

    1. 唯一性和排序: Map集合中唯一性和排序都是針對鍵來說的。鍵是唯一的,而值可以發生重複。
    2. 鍵的唯一性: 在Map集合中,每個鍵只能對映到一個值,不能有重複的鍵。
    3. 值的重複性: 一個值可以對應多個鍵,即值可以重複。

示例程式碼

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>: 表示型別引數是EE的子類。
    - <? super E>: 表示型別引數是EE的父類。
  • 用途:
    - 提供了更靈活的泛型使用方式,尤其是在處理繼承關係中的型別時。

可變引數

  • 語法:
    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(List list):
    - 對指定的列表進行排序。
    - 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類中的方法時,需要注意執行緒安全問題,特別是在迭代集合時。

相關文章