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

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

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

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]刪除
最新教學 更多>
  • 如何在 HTML 中使用 PHP?
    如何在 HTML 中使用 PHP?
    要在HTML 中使用PHP,必須用PHP 開始標記. 在本文中,我們將透過範例學習如何在HTML 中使用PHP。 PHP(超文本預處理器) 是用於 Web 開發的流行伺服器端腳本語言。它允許您將動態內容嵌入到您的HTML。 在 HTML 中使用 PHP 的方法 要在 HTML 中有效使用 PHP...
    程式設計 發佈於2024-11-08
  • 使用 LangSmith Hub 改變您的工作流程:JavaScript 工程師的遊戲規則改變者
    使用 LangSmith Hub 改變您的工作流程:JavaScript 工程師的遊戲規則改變者
    分散的人工智能提示是否会减慢您的开发进程?了解 LangChain Hub 如何彻底改变您的工作流程,为 JavaScript 工程师提供无缝且高效的即时管理。 介绍 想象一下管理一个项目,其中关键信息分散在文件中。令人沮丧,对吧?这就是处理 AI 提示的开发人员面临的现实。 Lan...
    程式設計 發佈於2024-11-08
  • 如何在 PHP 中將數值轉換為字串表示形式?
    如何在 PHP 中將數值轉換為字串表示形式?
    將數值轉換為PHP 中的字串表示形式將數值轉換為PHP 中對應的字串版本是一項常見任務,尤其是在工作時與文字處理或面向使用者的應用程式。當處理特定範圍內的值時,這種轉換變得尤其重要,例如將數字從 1 到 99 轉換為其等效文字。 要執行此轉換,我們可以利用 PEAR 套件 Numbers_Words...
    程式設計 發佈於2024-11-08
  • 如何在 Bigquery 參數化查詢中傳遞結構數組
    如何在 Bigquery 參數化查詢中傳遞結構數組
    在Google的Bigquery中,SQL查詢可以參數化。如果您不熟悉這個概念,它基本上意味著您可以將 SQL 查詢編寫為參數化模板,如下所示: INSERT INTO mydataset.mytable(columnA, columnB) VALUES (@valueA, @valueB)...
    程式設計 發佈於2024-11-08
  • 如何使用 Python“for”循環實現 C/C++ 風格循環?
    如何使用 Python“for”循環實現 C/C++ 風格循環?
    在Python 中實現C/C 風格循環:“for”循環在Python 中,循環提供了一種用於迭代序列的通用機制。雖然 Python 的「for」循環語法與其 C/C 對應部分不同,但實現類似的功能仍然是可行的。 考慮C/C 中的以下循環:for(int k = 1; k <= c; k = ...
    程式設計 發佈於2024-11-08
  • Laravel 入門:查詢產生器初學者指南
    Laravel 入門:查詢產生器初學者指南
    Laravel 的 查询生成器 提供了一个强大、流畅的界面,用于在 PHP 中构建 SQL 查询。它允许您以富有表现力的、类似 SQL 的语法与数据库交互,同时抽象出大部分复杂性。 我们将演练 Laravel 应用程序中的典型用例,使用查询生成器执行各种任务,例如选择、插入、更新和删除数据。 ...
    程式設計 發佈於2024-11-08
  • 如何截斷長分頁清單以增強使用者體驗?
    如何截斷長分頁清單以增強使用者體驗?
    截斷長頁面清單以實現高效分頁分頁是任何顯示大量資料的網站或應用程式的重要組成部分,因為它允許用戶以可管理的區塊的方式瀏覽它。但是,如果以簡單的方式實現,分頁可能會導致頁面清單過長,特別是當應用於具有大量頁面的資料集時。 為了緩解此問題,有必要截斷這些頁面清單為使用者提供更簡潔的導航選項。在本文中,我...
    程式設計 發佈於2024-11-08
  • 如何在 JavaScript 中展平數組
    如何在 JavaScript 中展平數組
    使用遞歸和 while 循環是更簡單的方法之一 export default function flatten(value) { const arr = [] const flat = (a) => { let counter = 0 console.log(a) ...
    程式設計 發佈於2024-11-08
  • 為什麼我無法在 Powershell 中執行複雜的 ImageMagick 命令,但它們可以在 CMD 中運行?
    為什麼我無法在 Powershell 中執行複雜的 ImageMagick 命令,但它們可以在 CMD 中運行?
    ImageMagick 指令無法在Powershell 中運行,但在cmd 視窗中執行沒有問題在嘗試使用ImageMagick 指令時,使用者在Powershell 視窗中執行它們時遇到了挑戰。這些命令在 cmd 視窗中無縫運行。嘗試在括號前添加反斜線來解決該問題也沒有成功。調查顯示,magick指...
    程式設計 發佈於2024-11-08
  • 什麼時候可以從 C++ 標準函式庫類別繼承?
    什麼時候可以從 C++ 標準函式庫類別繼承?
    透過繼承擴展 C 標準庫雖然人們通常認為從 C標準庫類別繼承是不可取的,但也有一些值得注意的例外.用於繼承的可識別類別確定標準庫類別是否用於繼承可能具有挑戰性。但是,以下準則可以提供一些見解:如果類別具有虛方法,則它可能是繼承的候選者。 過多的「friend」聲明表明存在封裝問題,從而導致繼承不太合...
    程式設計 發佈於2024-11-08
  • 利用 AI 快速學習 Node.js - 第 2 天
    利用 AI 快速學習 Node.js - 第 2 天
    今天,我借助AI繼續我的Node.js學習之旅,第2天的主題是Node.js中的模組系統。由於我已經熟悉 JavaScript,因此了解這種語言如何將程式碼組織成模組,使其更易於建置和重複使用是很有趣的。 理論部分:Node.js 中的模組基礎知識 首先,我完成了理論部分,其中解釋...
    程式設計 發佈於2024-11-08
  • 優化 Next.js 應用效能的經過驗證的技巧 ⚡️
    優化 Next.js 應用效能的經過驗證的技巧 ⚡️
    优化 Web 应用程序的性能对于提供快速、流畅的用户体验至关重要。 借助 Next.js 这个强大的 React 框架,您可以利用许多内置功能来提高应用程序的速度和效率。 以下是让 Next.js 应用获得最佳性能的十个关键策略: 1. 仅加载您需要的 JavaScript 和 ...
    程式設計 發佈於2024-11-08
  • 為什麼 Python 和 Golang Zlib 會產生不同的壓縮輸出?
    為什麼 Python 和 Golang Zlib 會產生不同的壓縮輸出?
    了解Golang 和Python Zlib 輸出的差異使用Zlib 壓縮來壓縮字串時,Python 的zlib 函式庫會產生與Golang 的zlib 實作。具體來說,第五個位元組不同,Python 的值為 0,而 Golang 的值為 4。 差異原因輸出的差異源自於來自 Python 和 Go 函...
    程式設計 發佈於2024-11-08
  • 如何使用 ESLint 規則讓 JavaScript 錯誤處理更具可讀性
    如何使用 ESLint 規則讓 JavaScript 錯誤處理更具可讀性
    简介:掌握 JavaScript 中的错误处理 有效的错误处理对于任何健壮的 JavaScript 应用程序都至关重要。它有助于快速识别问题、简化调试并增强软件可靠性。本指南深入探讨通过 ESLint 改进 JavaScript 错误处理,ESLint 是一种增强代码质量并标准化错...
    程式設計 發佈於2024-11-08
  • 如何在PHP中按副檔名高效過濾檔案?
    如何在PHP中按副檔名高效過濾檔案?
    在PHP 中按擴展名高效過濾文件您希望根據文件擴展名過濾目錄中的文件,特別是. ini 文件。雖然 scandir() 提供目錄中所有文件的列表,但它並不是過濾檢索最有效的方法。 利用 PHP 的 glob() 函數高效取得具有特定副檔名的文件,利用 PHP 的 glob() 函式。此函數採用模式匹...
    程式設計 發佈於2024-11-08

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

Copyright© 2022 湘ICP备2022001581号-3