」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 探索 HashSet:深入研究無序集合

探索 HashSet:深入研究無序集合

發佈於2024-11-08
瀏覽:287

Exploring HashSet: A Dive into Unordered Collections

介紹

HashSet 類別是 Java 集合架構的一部分,提供快速、無序的集合,不允許重複元素。它建構在 HashMap 之上,這意味著它繼承了相同的時間複雜度優勢,但純粹關注元素唯一性。在本文中,我們將探討 HashSet 的工作原理、它的獨特之處以及它與其他集合的不同之處。


什麼是哈希集?

哈希集是:

  • 無序:元素沒有可預測的順序。
  • 唯一:忽略重複元素。
  • 內部由HashMap支援:它使用HashMap來儲存元素,僅關注而丟棄值。
  • O(1)平均時間複雜度:插入、刪除、尋找等操作效率很高。

1. 初始化HashSet

// Parameterized constructor with initial capacity
Set setWithInitialCapacity = new HashSet(5);

// Parameterized constructor using a collection
Set setWithCollection = new HashSet(Arrays.asList(4, 4, 3));

// Default constructor with default capacity 16
Set set = new HashSet();

解釋:

  • 預設建構子: 建立一個初始容量為 16 的 HashSet。
  • 參數化建構子:可以指定初始容量,但注意容量與大小不同。大小是指集合中實際元素的數量。
  • 使用集合: 可以從像列表這樣的集合創建 HashSet,確保只保留唯一元素。

2. 在 HashSet 中加入元素

set.add(1);
set.add(2);
set.add(1); // Duplicate value is ignored
System.out.println(set); // Output -> [1, 2]

解釋:

  • add()方法將元素插入HashSet中。
  • 重複元素將被忽略。 當您嘗試將 1 新增兩次時,僅保留第一次出現的元素。

重點

如果您需要替換重複值而不是忽略它們,HashSet 將不是正確的選擇。這是因為它優先考慮元素的唯一性


3. 檢查尺寸與容量

// Parameterized constructor with initial capacity
Set setWithInitialCapacity = new HashSet(5);
System.out.println(setWithInitialCapacity.size()); // Output -> 0

儘管 setWithInitialCapacity 的容量為 5,但 size 為 0,因為 size 反映的是集合中存在的元素數量,而不是初始容量。您可以將容量視為內部儲存空間,它會隨著元素的增加而調整。


4. 將 HashSet 與集合一起使用

// Parameterized constructor using a collection
Set setWithCollection = new HashSet(Arrays.asList(4, 4, 3));
System.out.println(setWithCollection); // Output -> [3, 4] or [4, 3]

解釋:

  • 儘管清單中提供了三個元素(4、4、3),但重複值4被丟棄,只留下兩個元素(3和4)。
  • 元素的順序是不可預測的因為HashSet不維護任何插入或自然順序。

如果需要保留已排序的元素,請考慮使用TreeSet,它確保元素按升序排列


5. HashSet 中的索引 – 可能嗎?

在訪談中,一個常見的問題是是否可以檢索 HashSet 中元素的索引。答案是,因為HashSet使用哈希機制來儲存元素,而不是像列表或陣列那樣基於索引的結構。


重點總結

  1. 無序且唯一: HashSet 只保留唯一元素,忽略重複項。
  2. 基於HashMap:它使用內部HashMap的鍵來儲存元素。
  3. 快速操作:新增、刪除和檢查元素的平均時間複雜度為O(1)
  4. 容量與大小:容量是分配的空間,而大小是實際的元素數量。
  5. 無索引:由於雜湊機制,您無法透過索引檢索元素。

與HashMap的關係

由於HashSet由HashMap支持,因此它使用映射的來儲存元素,而值是不相關的。這就是為什麼 HashSet 中的每個元素都必須是唯一的,就像 HashMap 中的鍵一樣。


結論

當您需要快速、無序的集合來避免重複時,HashSet 是一個強大的工具。雖然它為大多數操作提供了 O(1) 時間複雜度,但它缺乏排序和索引等功能。對於開發人員來說,了解 HashSet 與 HashMap 的關係有助於理解其內部運作並更好地利用集合框架。

在下一篇文章中,我們將探討訪談中常見的訪談問題,以測試候選人對集合概念的了解。


相關貼文

  • Java 基礎

  • Array面試重點

  • Java 記憶體基礎

快樂編碼!

版本聲明 本文轉載於:https://dev.to/arshisaxena26/exploring-hashset-a-dive-into-unordered-collections-4ehb?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 可以在純CS中將多個粘性元素彼此堆疊在一起嗎?
    可以在純CS中將多個粘性元素彼此堆疊在一起嗎?
    [2这里: https://webthemez.com/demo/sticky-multi-header-scroll/index.html </main> <section> { display:grid; grid-template-...
    程式設計 發佈於2025-07-06
  • CSS強類型語言解析
    CSS強類型語言解析
    您可以通过其强度或弱输入的方式对编程语言进行分类的方式之一。在这里,“键入”意味着是否在编译时已知变量。一个例子是一个场景,将整数(1)添加到包含整数(“ 1”)的字符串: result = 1 "1";包含整数的字符串可能是由带有许多运动部件的复杂逻辑套件无意间生成的。它也可以是故意从单个真理...
    程式設計 發佈於2025-07-06
  • 如何從PHP中的數組中提取隨機元素?
    如何從PHP中的數組中提取隨機元素?
    從陣列中的隨機選擇,可以輕鬆從數組中獲取隨機項目。考慮以下數組:; 從此數組中檢索一個隨機項目,利用array_rand( array_rand()函數從數組返回一個隨機鍵。通過將$項目數組索引使用此鍵,我們可以從數組中訪問一個隨機元素。這種方法為選擇隨機項目提供了一種直接且可靠的方法。
    程式設計 發佈於2025-07-06
  • 為什麼儘管有效代碼,為什麼在PHP中捕獲輸入?
    為什麼儘管有效代碼,為什麼在PHP中捕獲輸入?
    在php ;?>" method="post">The intention is to capture the input from the text box and display it when the submit button is clicked.但是,輸出...
    程式設計 發佈於2025-07-06
  • 如何克服PHP的功能重新定義限制?
    如何克服PHP的功能重新定義限制?
    克服PHP的函數重新定義限制在PHP中,多次定義一個相同名稱的函數是一個no-no。嘗試這樣做,如提供的代碼段所示,將導致可怕的“不能重新列出”錯誤。 但是,PHP工具腰帶中有一個隱藏的寶石:runkit擴展。它使您能夠靈活地重新定義函數。 runkit_function_renction_...
    程式設計 發佈於2025-07-06
  • C++20 Consteval函數中模板參數能否依賴於函數參數?
    C++20 Consteval函數中模板參數能否依賴於函數參數?
    [ consteval函數和模板參數依賴於函數參數在C 17中,模板參數不能依賴一個函數參數,因為編譯器仍然需要對非contexexpr futcoriations contim at contexpr function進行評估。 compile time。 C 20引入恆定函數,必須在編譯時進...
    程式設計 發佈於2025-07-06
  • 找到最大計數時,如何解決mySQL中的“組函數\”錯誤的“無效使用”?
    找到最大計數時,如何解決mySQL中的“組函數\”錯誤的“無效使用”?
    如何在mySQL中使用mySql 檢索最大計數,您可能會遇到一個問題,您可能會在嘗試使用以下命令:理解錯誤正確找到由名稱列分組的值的最大計數,請使用以下修改後的查詢: 計數(*)為c 來自EMP1 按名稱組 c desc訂購 限制1 查詢說明 select語句提取名稱列和每個名稱...
    程式設計 發佈於2025-07-06
  • 如何實時捕獲和流媒體以進行聊天機器人命令執行?
    如何實時捕獲和流媒體以進行聊天機器人命令執行?
    在開發能夠執行命令的chatbots的領域中,實時從命令執行實時捕獲Stdout,一個常見的需求是能夠檢索和顯示標準輸出(stdout)在cath cath cant cant cant cant cant cant cant cant interfaces in Chate cant inter...
    程式設計 發佈於2025-07-06
  • 如何修復\“常規錯誤:2006 MySQL Server在插入數據時已經消失\”?
    如何修復\“常規錯誤:2006 MySQL Server在插入數據時已經消失\”?
    How to Resolve "General error: 2006 MySQL server has gone away" While Inserting RecordsIntroduction:Inserting data into a MySQL database can...
    程式設計 發佈於2025-07-06
  • Android如何向PHP服務器發送POST數據?
    Android如何向PHP服務器發送POST數據?
    在android apache httpclient(已棄用) httpclient httpclient = new defaulthttpclient(); httppost httppost = new httppost(“ http://www.yoursite.com/script.p...
    程式設計 發佈於2025-07-06
  • Java的Map.Entry和SimpleEntry如何簡化鍵值對管理?
    Java的Map.Entry和SimpleEntry如何簡化鍵值對管理?
    A Comprehensive Collection for Value Pairs: Introducing Java's Map.Entry and SimpleEntryIn Java, when defining a collection where each element com...
    程式設計 發佈於2025-07-06
  • 如何使用“ JSON”軟件包解析JSON陣列?
    如何使用“ JSON”軟件包解析JSON陣列?
    parsing JSON與JSON軟件包 QUALDALS:考慮以下go代碼:字符串 } func main(){ datajson:=`[“ 1”,“ 2”,“ 3”]`` arr:= jsontype {} 摘要:= = json.unmarshal([] byte(...
    程式設計 發佈於2025-07-06
  • 在Python中如何創建動態變量?
    在Python中如何創建動態變量?
    在Python 中,動態創建變量的功能可以是一種強大的工具,尤其是在使用複雜的數據結構或算法時,Dynamic Variable Creation的動態變量創建。 Python提供了幾種創造性的方法來實現這一目標。 利用dictionaries 一種有效的方法是利用字典。字典允許您動態創建密鑰並...
    程式設計 發佈於2025-07-06
  • 如何從Google API中檢索最新的jQuery庫?
    如何從Google API中檢索最新的jQuery庫?
    從Google APIS 問題中提供的jQuery URL是版本1.2.6。對於檢索最新版本,以前有一種使用特定版本編號的替代方法,它是使用以下語法:獲取最新版本:未壓縮)While these legacy URLs still remain in use, it is recommended ...
    程式設計 發佈於2025-07-06
  • 反射動態實現Go接口用於RPC方法探索
    反射動態實現Go接口用於RPC方法探索
    在GO 使用反射來實現定義RPC式方法的界面。例如,考慮一個接口,例如:鍵入myService接口{ 登錄(用戶名,密碼字符串)(sessionId int,錯誤錯誤) helloworld(sessionid int)(hi String,錯誤錯誤) } 替代方案而不是依靠反射...
    程式設計 發佈於2025-07-06

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3