嘿,Java 愛好者!無論您是試圖找出集合存在原因的編碼新手,還是身經百戰的程式設計師想知道是否還有更多東西需要學習,本指南都適合您。我們將深入探討 Java 中 Set 的所有內容,從其核心目的到複雜的工作原理。係好安全帶!
首先要做的事情是:什麼是 Set,我們為什麼要關心?從本質上講,Set 是一個不能包含重複元素的集合。換句話說,集合中的每個項目都與您的自訂迷因集合一樣獨特。
想像一下,您的任務是為派對建立賓客名單。您要確保沒有人收到兩次邀請(因為這很尷尬)。 進入集合。對於 Set,Java 會自動確保所有元素都是不同的。它非常適合需要獨特性的情況。
不允許重複:Set 最重要的特徵是它從不允許重複元素。加入一個已經存在的元素? Java 禮貌地拒絕(不像你的老闆有更多的工作)。
無序(通常):集合與清單不同,不關心插入順序。只要保持獨特性,他們就會很高興。
Null 處理 :某些 Set 允許 null 作為元素,但僅限一次。
現在我們知道了 Set 的作用,讓我們看看 Java 提供了哪些類型的 Set:
特性:在 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]
特性: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]
特點:實作NavigableSet,使用紅黑樹儲存。
記憶體佈局:平衡的樹狀結構。
程式碼範例 :
Set<String> linkedHashSet = new LinkedHashSet<>(); linkedHashSet.add("Apple"); linkedHashSet.add("Banana"); linkedHashSet.add("Orange"); System.out.println(linkedHashSet); // Output: [Apple, Banana, Orange]
讓我們掀起引擎蓋看看裡面。 HashSet 使用 哈希表 進行存儲,其中每個元素根據其哈希碼分配一個存儲桶。新增元素時會發生以下情況:
雜湊碼計算 :Java 呼叫 hashCode() 方法取得元素的雜湊碼。
桶確定 :將雜湊碼對應到桶(陣列索引)。
碰撞處理:如果儲存桶已經被佔用(碰撞),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]
如果您知道正確的技巧,使用集合會很有趣:
[0] -> [Apple] -> [Banana] [1] -> [Grapes] [2] -> [null] [3] -> [Orange] ...
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]
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 不是您的朋友。請改用清單。
如果您需要重複項(例如,計算項目的出現次數),請考慮清單或地圖。
這是最常用方法的備忘單:
add(E e) :如果元素尚不存在,則加入該元素。
remove(Object o) :刪除指定元素(如果存在)。
contains(Object o) :檢查某個元素是否在 Set 中。
size() :傳回元素的數量。
clear() :刪除所有元素。
isEmpty() :檢查 Set 是否為空。
iterator() :傳回元素上的迭代器。
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]
併發集 :
使用 ConcurrentHashMap.newKeySet() 或 CopyOnWriteArraySet 進行執行緒安全性操作。
不可變集 :
使用 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 給出了可預測的迭代順序,且開銷很小。
認識問題類型 :
唯一性檢查(例如,尋找文件中的唯一單字)。
設定操作(例如,找出使用者之間的共同好友)。
快速查找,不重複(例如,在恆定時間內檢查元素是否存在)。
雖然集合可能不像清單那樣迷人,也不像地圖那樣神秘,但它們在有效維護唯一集合方面發揮著至關重要的作用。他們是無名英雄,可確保您的資料保持乾淨和獨特,使您免於那些可能導致意外結果的討厭的重複。無論您是在最佳化演算法、確保資料完整性,還是只是嘗試選擇一個的結構只是有效,從內到外理解集合將使您成為更強大的開發人員。因此,充滿信心地繼續編碼,知道您已經釋放了強大集合的真正潛力!
這是一個包裝,夥計們!
以上是Java 集合的終極指南:揭開這個不起眼的資料結構的每一個秘密的詳細內容。更多資訊請關注PHP中文網其他相關文章!