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

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

Nov 21, 2024 am 12:39 AM

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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1662
14
CakePHP 教程
1418
52
Laravel 教程
1311
25
PHP教程
1261
29
C# 教程
1234
24
公司安全軟件導致應用無法運行?如何排查和解決? 公司安全軟件導致應用無法運行?如何排查和解決? Apr 19, 2025 pm 04:51 PM

公司安全軟件導致部分應用無法正常運行的排查與解決方法許多公司為了保障內部網絡安全,會部署安全軟件。 ...

如何將姓名轉換為數字以實現排序並保持群組中的一致性? 如何將姓名轉換為數字以實現排序並保持群組中的一致性? Apr 19, 2025 pm 11:30 PM

將姓名轉換為數字以實現排序的解決方案在許多應用場景中,用戶可能需要在群組中進行排序,尤其是在一個用...

如何使用MapStruct簡化系統對接中的字段映射問題? 如何使用MapStruct簡化系統對接中的字段映射問題? Apr 19, 2025 pm 06:21 PM

系統對接中的字段映射處理在進行系統對接時,常常會遇到一個棘手的問題:如何將A系統的接口字段有效地映�...

IntelliJ IDEA是如何在不輸出日誌的情況下識別Spring Boot項目的端口號的? IntelliJ IDEA是如何在不輸出日誌的情況下識別Spring Boot項目的端口號的? Apr 19, 2025 pm 11:45 PM

在使用IntelliJIDEAUltimate版本啟動Spring...

Java對像如何安全地轉換為數組? Java對像如何安全地轉換為數組? Apr 19, 2025 pm 11:33 PM

Java對象與數組的轉換:深入探討強制類型轉換的風險與正確方法很多Java初學者會遇到將一個對象轉換成數組的�...

如何優雅地獲取實體類變量名構建數據庫查詢條件? 如何優雅地獲取實體類變量名構建數據庫查詢條件? Apr 19, 2025 pm 11:42 PM

在使用MyBatis-Plus或其他ORM框架進行數據庫操作時,經常需要根據實體類的屬性名構造查詢條件。如果每次都手動...

如何利用Redis緩存方案高效實現產品排行榜列表的需求? 如何利用Redis緩存方案高效實現產品排行榜列表的需求? Apr 19, 2025 pm 11:36 PM

Redis緩存方案如何實現產品排行榜列表的需求?在開發過程中,我們常常需要處理排行榜的需求,例如展示一個�...

電商平台SKU和SPU數據庫設計:如何兼顧用戶自定義屬性和無屬性商品? 電商平台SKU和SPU數據庫設計:如何兼顧用戶自定義屬性和無屬性商品? Apr 19, 2025 pm 11:27 PM

電商平台SKU和SPU表設計詳解本文將探討電商平台中SKU和SPU的數據庫設計問題,特別是如何處理用戶自定義銷售屬...

See all articles