首頁  >  文章  >  Java  >  Java 集合的終極指南:揭開這個不起眼的資料結構的每一個秘密

Java 集合的終極指南:揭開這個不起眼的資料結構的每一個秘密

Susan Sarandon
Susan Sarandon原創
2024-11-21 00:39:16318瀏覽

The Ultimate Guide to Sets in Java: Uncovering Every Secret of This Humble Data Structure

嘿,Java 愛好者!無論您是試圖找出集合存在原因的編碼新手,還是身經百戰的程式設計師想知道是否還有更多東西需要學習,本指南都適合您。我們將深入探討 Java 中 Set 的所有內容,從其核心目的到複雜的工作原理。係好安全帶!


什麼是集合?

首先要做的事情是:什麼是 Set,我們為什麼要關心?從本質上講,Set 是一個不能包含重複元素的集合。換句話說,集合中的每個項目都與您的自訂迷因集合一樣獨特。

為什麼要使用一套?

想像一下,您的任務是為派對建立賓客名單。您要確保沒有人收到兩次邀請(因為這很尷尬)。 進入集合。對於 Set,Java 會自動確保所有元素都是不同的。它非常適合需要獨特性的情況。

集合的特徵

  • 不允許重複:Set 最重要的特徵是它從不允許重複元素。加入一個已經存在的元素? Java 禮貌地拒絕(不像你的老闆有更多的工作)。

  • 無序(通常):集合與清單不同,不關心插入順序。只要保持獨特性,他們就會很高興。

  • Null 處理 :某些 Set 允許 null 作為元素,但僅限一次。


Java 中的集合類型

現在我們知道了 Set 的作用,讓我們看看 Java 提供了哪些類型的 Set:

  1. 雜湊集
    • 目的:大多數用例的首選設定。
  • 特性:在 HashMap 的支援下,HashSet 可以快速且有效率地檢查元素是否存在(大多數操作的時間複雜度為 O(1))。

  • 記憶體佈局:在底層使用雜湊表,其中基於雜湊函數儲存元素。

  • 允許空值嗎? :可以,但只能有一個。

  • 程式碼範例 :

Set<String> hashSet = new HashSet<>();
hashSet.add("Apple");
hashSet.add("Banana");
hashSet.add("Apple"); // This will be ignored
System.out.println(hashSet); // Output: [Apple, Banana]
  1. LinkedHashSet
    • 用途:如果您需要一個維護插入順序的 Set。
  • 特性:HashSet 和 LinkedList 的混合體。

  • 記憶體佈局

    :使用雜湊表和雙向鍊錶來維護順序。

  • 程式碼範例

    :

Set<String> hashSet = new HashSet<>();
hashSet.add("Apple");
hashSet.add("Banana");
hashSet.add("Apple"); // This will be ignored
System.out.println(hashSet); // Output: [Apple, Banana]
  1. 樹集
    • 用途:以排序順序儲存元素的Set。
  • 特點:實作NavigableSet,使用紅黑樹儲存。

  • 記憶體佈局:平衡的樹狀結構。

  • 程式碼範例 :

Set<String> linkedHashSet = new LinkedHashSet<>();
linkedHashSet.add("Apple");
linkedHashSet.add("Banana");
linkedHashSet.add("Orange");
System.out.println(linkedHashSet); // Output: [Apple, Banana, Orange]

哈希集如何工作?

讓我們掀起引擎蓋看看裡面。 HashSet 使用 哈希表 進行存儲,其中每個元素根據其哈希碼分配一個存儲桶。新增元素時會發生以下情況:

  1. 雜湊碼計算 :Java 呼叫 hashCode() 方法取得元素的雜湊碼。

  2. 桶確定 :將雜湊碼對應到桶(陣列索引)。

  3. 碰撞處理:如果儲存桶已經被佔用(碰撞),Java 使用chaining(較新的Java 版本中的鍊錶或平衡樹)來管理中的多個元素同一個桶子。
    HashSet結構圖:

Set<Integer> treeSet = new TreeSet<>();
treeSet.add(42);
treeSet.add(10);
treeSet.add(25);
System.out.println(treeSet); // Output: [10, 25, 42]

使用集合的技巧

如果您知道正確的技巧,使用集合會很有趣:

  1. 兩個集合的並集
[0] -> [Apple] -> [Banana] 
[1] -> [Grapes]
[2] -> [null]
[3] -> [Orange]
...
  1. 兩個集合的交集
Set<Integer> set1 = new HashSet<>(Arrays.asList(1, 2, 3));
Set<Integer> set2 = new HashSet<>(Arrays.asList(3, 4, 5));
set1.addAll(set2);
System.out.println(set1); // Output: [1, 2, 3, 4, 5]
  1. 各組之間的差異
Set<Integer> set1 = new HashSet<>(Arrays.asList(1, 2, 3));
Set<Integer> set2 = new HashSet<>(Arrays.asList(3, 4, 5));
set1.retainAll(set2);
System.out.println(set1); // Output: [3]

何時使用套裝?

常見場景

  • 確保應用程式中唯一的使用者名稱

  • 在網路爬蟲中追蹤 造訪過的頁面

  • 維護獨特的項目集合(例如,選舉中的獨特選民)。
    需要考慮的危險訊號

  • 如果您需要透過索引存取元素,Set 不是您的朋友。請改用清單。

  • 如果您需要重複項(例如,計算項目的出現次數),請考慮清單或地圖。

Set 介面中的方法

這是最常用方法的備忘單:

  • add(E e) :如果元素尚不存在,則加入該元素。

  • remove(Object o) :刪除指定元素(如果存在)。

  • contains(Object o) :檢查某個元素是否在 Set 中。

  • size() :傳回元素的數量。

  • clear() :刪除所有元素。

  • isEmpty() :檢查 Set 是否為空。

  • iterator() :傳回元素上的迭代器。


先進的技術和技巧

  1. 集合中的自訂物件: 始終重寫自訂物件的 equals() 和 hashCode() 以確保 Set 的行為符合預期。
Set<String> hashSet = new HashSet<>();
hashSet.add("Apple");
hashSet.add("Banana");
hashSet.add("Apple"); // This will be ignored
System.out.println(hashSet); // Output: [Apple, Banana]
  1. 併發集 :
    使用 ConcurrentHashMap.newKeySet() 或 CopyOnWriteArraySet 進行執行緒安全性操作。

  2. 不可變集 :
    使用 Collections.unmodifyingSet() 或 Set.of() 建立唯讀集。

Set<String> linkedHashSet = new LinkedHashSet<>();
linkedHashSet.add("Apple");
linkedHashSet.add("Banana");
linkedHashSet.add("Orange");
System.out.println(linkedHashSet); // Output: [Apple, Banana, Orange]

性能考慮因素

HashSet 是大多數任務的最佳選擇,因為它在新增、刪除和檢查元素方面具有 O(1) 效能。 TreeSet 具有較高的成本 (O(log n)),但增加了自然排序的好處。 LinkedHashSet 給出了可預測的迭代順序,且開銷很小。

識別適合 Set 的問題

認識問題類型 :

  • 唯一性檢查(例如,尋找文件中的唯一單字)。

  • 設定操作(例如,找出使用者之間的共同好友)。

  • 快速查找,不重複(例如,在恆定時間內檢查元素是否存在)。

最後的想法

雖然集合可能不像清單那樣迷人,也不像地圖那樣神秘,但它們在有效維護唯一集合方面發揮著至關重要的作用。他們是無名英雄,可確保您的資料保持乾淨和獨特,使您免於那些可能導致意外結果的討厭的重複。無論您是在最佳化演算法、確保資料完整性,還是只是嘗試選擇一個的結構只是有效,從內到外理解集合將使您成為更強大的開發人員。因此,充滿信心地繼續編碼,知道您已經釋放了強大集合的真正潛力!


這是一個包裝,夥計們!

以上是Java 集合的終極指南:揭開這個不起眼的資料結構的每一個秘密的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn