數據結構-HashSet

在 Java 編程的世界里,集合框架是極為重要的一部分,而?HashSet?作為 Set 接口的典型實現類,在處理不允許重復元素的場景中頻繁亮相。今天,我們就一同深入探究?HashSet,梳理它的特點、常用方法,以及和其他相關集合的關聯,方便后續隨時回顧知識點。

一、HashSet 集合的特點

(一)底層實現

HashSet?底層依托?HashMap?實現 。我們向?HashSet?添加元素時,實際是把元素作為?HashMap?的?key?存儲,利用?HashMap?key?不允許重復的特性,保證了?HashSet?元素的唯一性。

(二)元素特性

  • 無序性:無法保證元素的存儲和取出順序一致,元素在集合里是無序排列的,每次遍歷結果順序可能不同 。
  • 唯一性:集合中不能存在重復元素,這由底層?HashMap?保障。
  • 允許 null 值:集合元素值可以為?null,不過只能有一個?null?元素,畢竟?HashMap?的?key?雖能為?null,但也得唯一。
  • 線程不安全:在多線程環境下,若多個線程同時操作?HashSet,可能引發數據不一致問題,需額外做線程同步處理。

二、HashSet 常用方法

(一)添加元素:add (Object o)

用于向?HashSet?集合添加元素,若元素已存在,不會重復添加,返回?false;添加成功返回?true?。示例代碼:

HashSet<String> set = new HashSet<>();
set.add("Java");
set.add("Python");
set.add("Java"); // 重復元素,添加失敗

(二)獲取元素個數:size ()

返回?HashSet?集合中當前元素的數量 。示例:

HashSet<String> set = new HashSet<>();
set.add("Java");
set.add("Python");
System.out.println(set.size()); // 輸出 2

(三)刪除元素:remove (Object o)

刪除集合中指定的?obj?對象,刪除成功返回?true,元素不存在則返回?false?。代碼示例:

HashSet<String> set = new HashSet<>();
set.add("Java");
set.add("Python");
System.out.println(set.remove("Python")); // 輸出 true,刪除成功
System.out.println(set.remove("C++")); // 輸出 false,元素不存在

(四)判斷是否為空:isEmpty ()

若?HashSet?不包含任何元素,返回?true,否則返回?false?。示例:

HashSet<String> set = new HashSet<>();
System.out.println(set.isEmpty()); // 輸出 true
set.add("Java");
System.out.println(set.isEmpty()); // 輸出 false

(五)清空集合:clear ()

移除?HashSet?中的所有元素,執行后集合為空 。示例:

HashSet<String> set = new HashSet<>();
set.add("Java");
set.add("Python");
set.clear();
System.out.println(set.isEmpty()); // 輸出 true

(六)迭代器遍歷:iterator ()

返回一個在此?HashSet?元素上進行迭代的迭代器,借助迭代器可遍歷集合元素 。示例:

HashSet<String> set = new HashSet<>();
set.add("Java");
set.add("Python");
Iterator<String> ite = set.iterator();
while (ite.hasNext()) {System.out.println(ite.next());
}

(七)判斷元素是否存在:contains (Object o)

用于判斷集合中是否包含指定的?obj?元素,存在返回?true,不存在返回?false?。示例:

HashSet<String> set = new HashSet<>();
set.add("Java");
System.out.println(set.contains("Java")); // 輸出 true
System.out.println(set.contains("C++")); // 輸出 false

(八)增強 for 循環遍歷

通過增強?for?循環(foreach)可便捷遍歷?HashSet?集合中的元素 。示例:

HashSet<String> set = new HashSet<>();
set.add("Java");
set.add("Python");
for (String element : set) {System.out.println(element);
}

三、與其他集合的關聯及使用場景對比

(一)與 LinkedHashSet

LinkedHashSet?底層基于?HashSet,同時用鏈表維護元素插入順序。它兼具?HashSet?元素唯一的特性,又能保證元素有序(按插入順序) 。若需元素唯一且順序和插入一致,選?LinkedHashSet;追求添加、查詢高性能,無需順序,用?HashSet?。

(二)與 TreeSet

TreeSet?內部用?TreeMap(基于紅黑樹實現),會對插入數據排序(自然排序或定制排序),元素唯一、值不能為?null?且線程不安全 。若需對元素排序,用?TreeSet;僅需元素唯一、無序,HashSet?更高效。

(三)與 List 集合(以區別角度看)

  • 有序性List(如?ArrayListLinkedList?)保證按插入順序排序,Set(包括?HashSet?)存儲和取出順序通常不一致 。
  • 唯一性List?允許元素重復,SetHashSet?等)元素唯一 。
  • 元素操作List?可通過索引直接操作元素,SetHashSet?)不能根據索引獲取元素 。

四、總結

HashSet?在 Java 集合框架里,憑借底層?HashMap?實現,實現了元素唯一、無序等特性,常用方法能滿足基本集合操作需求。和?LinkedHashSetTreeSet?及?List?集合各有適用場景,實際開發中,我們要依據元素是否需排序、是否要順序、是否允許重復等需求,合理選擇集合,讓代碼更高效、更貼合業務邏輯。掌握?HashSet?,能為我們處理數據集合相關問題筑牢基礎,后續也可結合更多復雜場景,深入挖掘它的潛力 。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/919613.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/919613.shtml
英文地址,請注明出處:http://en.pswp.cn/news/919613.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

心意行藥號 · 慈心方的八種用法

心意行藥號 慈心方的八種用法慈心方是心意行藥號589個珍貴秘方中的一個養生茶方&#xff0c;配伍比例科學嚴謹&#xff0c;君臣佐使堪稱經典&#xff0c;自古就有“小小慈心方&#xff0c;轉動大乾坤”之說。自清代光緒年間傳承至今&#xff0c;慈心方受益者逾百萬計&#xff…

Spring面試寶典:Spring IOC的執行流程解析

在準備Spring框架的面試時&#xff0c;“Spring IOC的工作流程是什么&#xff1f;” 是一個非常經典的問題。雖然網上有很多詳細的教程&#xff0c;但它們往往過于復雜&#xff0c;對于沒有深入研究過源碼的人來說理解起來確實有些困難。今天我們就來簡化這個概念&#xff0c;從…

學習日志39 python

1 fromkeys()函數是什么在 Python 中&#xff0c;fromkeys() 是字典&#xff08;dict&#xff09;的一個類方法&#xff0c;用于創建一個新字典。它的作用是&#xff1a;根據指定的可迭代對象&#xff08;如列表、元組等&#xff09;中的元素作為鍵&#xff08;key&#xff09;…

SpringBoot + MyBatis-Plus 使用 listObjs 報 ClassCastException 的原因與解決辦法

在項目中我們經常會遇到這種需求&#xff1a; 根據一組 ID 查詢數據庫&#xff0c;并返回指定字段列表。 我在寫代碼的時候&#xff0c;遇到了一個典型的坑&#xff0c;分享出來給大家。一、問題背景我的代碼是這樣寫的&#xff08;查詢項目表的負責人信息&#xff09;&#xf…

WT2606B 驅屏語音芯片新增藍牙功能:功能集成一體化,產品升級自動化,語音交互無線化,場景應用普適化!

小伙伴們&#xff0c;歡迎來到我們的 &#xff03;唯創芯片小講堂&#xff01;今天我們要為大家介紹一位多才多藝的"芯片全能手"——WT2606B驅屏語音芯片。這顆芯片將在今年8月的I0TE物聯網展及ELEXCON 2025深圳國際電子展上大放異彩。在智能設備滿天飛的今天&#x…

ORA-16331: container is not open ORA-06512: at “SYS.DBMS_LOGMNR“

使用Flink CDC、Debezium等CDC工具對Oracle進行基于log的實時數據同步時遇到異常ORA-16331: container is not open的解決方案。 1. 異常信息 異常信息通常如下&#xff1a; at oracle.jdbc.driver.OracleStatement.executeInternal(OracleStatement.java:1823) at oracle.jdbc…

「三維共振」:重構實體零售的破局模式

在電商沖擊與消費升級的雙重浪潮下&#xff0c;傳統零售模式正面臨前所未有的挑戰。wo店首創的 “三維共振” 運營模式&#xff0c;以場景體驗為根基、數據驅動為引擎、社群共生為紐帶&#xff0c;構建起線上線下深度融合的新型零售生態&#xff0c;至今已實現連續 18 個月客流…

將集合拆分成若干個batch,并將batch存于新的集合

在使用saveAll()等方法時&#xff0c;為了防止集合元素過大&#xff0c;使用splitList將原集合&#xff0c;分割成若干個小集合 import java.util.ArrayList; import java.util.List;public class ListUtils {/*** 將集合拆分成若干個batch,并將batch存于新的集合** param list…

Java主流框架全解析:從企業級開發到云原生

Java作為一門歷史悠久且應用廣泛的編程語言&#xff0c;其強大的生態系統離不開各種優秀的框架支持。無論是傳統的企業級應用開發&#xff0c;還是現代的微服務、云原生架構&#xff0c;Java都提供了豐富的框架選擇。本文將全面解析當前主流的Java框架&#xff0c;涵蓋Web開發、…

機器學習——網格搜索(GridSearchCV)超參數優化

網格搜索&#xff08;Grid Search&#xff09;詳細教學1. 什么是網格搜索&#xff1f;在機器學習模型中&#xff0c;算法的**超參數&#xff08;Hyperparameters&#xff09;**對模型的表現起著決定性作用。比如&#xff1a;KNN 的鄰居數量 n_neighborsSVM 的懲罰系數 C 和核函…

【LeetCode】18. 四數之和

文章目錄18. 四數之和題目描述示例 1&#xff1a;示例 2&#xff1a;提示&#xff1a;解題思路算法一&#xff1a;排序 雙指針&#xff08;推薦&#xff09;算法二&#xff1a;通用 kSum&#xff08;含 2Sum 雙指針&#xff09;復雜度關鍵細節代碼實現要點完整題解代碼18. 四數…

Go語言入門(10)-數組

訪問數組元素&#xff1a;數組中的每個元素都可以通過“[]”和一個從0開始的索引進行訪問數組的長度可由內置函數len來確定。在聲明數組時&#xff0c;未被賦值元素的值是對應類型的零值。下面看一個例子package mainfunc main(){var planets [8]stringplanets[0] "Mercu…

為什么經過IPSec隧道后HTTPS會訪問不通?一次隧道環境下的實戰分析

在運維圈子里&#xff0c;大家可能都遇到過這種奇怪的問題&#xff1a;瀏覽器能打開 HTTP 網站&#xff0c;但一換成 HTTPS&#xff0c;頁面就死活打不開。前段時間&#xff0c;我們就碰到這么一個典型案例。故障現象某公司系統在 VPN 隧道里訪問 HTTPS 服務&#xff0c;結果就…

【Linux系統】進程信號:信號的產生和保存

上篇文章我們介紹了Syetem V IPC的消息隊列和信號量&#xff0c;那么信號量和我們下面要介紹的信號有什么關系嗎&#xff1f;其實沒有關系&#xff0c;就相當于我們日常生活中常說的老婆和老婆餅&#xff0c;二者并沒有關系1. 認識信號1.1 生活角度的信號解釋&#xff08;快遞比…

WEB服務器(靜態/動態網站搭建)

簡介 名詞:HTML(超文本標記語言),網站(多個網頁組成一臺網站),主頁,網頁,URL(統一資源定位符) 網站架構:LAMP(linux(系統)+apache(服務器程序)+mysql(數據庫管理軟件)+php(中間軟件)) 靜態站點 Apache基礎 Apache官網:www.apache.org 軟件包名稱:…

開發避坑指南(29):微信昵稱特殊字符存儲異常修復方案

異常信息 Cause: java.sql.SQLException: Incorrect string value: \xF0\x9F\x8D\x8B\xE5\xBB... for column nick_name at row 1異常背景 抽獎大轉盤&#xff0c;抽獎后需要保存用戶抽獎記錄&#xff0c;用戶再次進入游戲時根據抽獎記錄判斷剩余抽獎機會。保存抽獎記錄時需要…

leetcode-python-242有效的字母異位詞

題目&#xff1a; 給定兩個字符串 s 和 t &#xff0c;編寫一個函數來判斷 t 是否是 s 的 字母異位詞。 示例 1: 輸入: s “anagram”, t “nagaram” 輸出: true 示例 2: 輸入: s “rat”, t “car” 輸出: false 提示: 1 < s.length, t.length < 5 * 104 s 和 t 僅…

【ARM】Keil MDK如何指定單文件的優化等級

1、 文檔目標解決在MDK中如何對于單個源文件去設置優化等級。2、 問題場景在正常的項目開發中&#xff0c;我們通常都是針對整個工程去做優化&#xff0c;相當于整個工程都是使用一個編譯器優化等級去進行的工程構建。那么在一些特定的情況下&#xff0c;工程師需要保證我的部分…

零基礎學Java第二十二講---異常(2)

續接上一講 目錄 一、異常的處理&#xff08;續&#xff09; 1、異常的捕獲-try-catch捕獲并處理異常 1.1關于異常的處理方式 2、finally 3、異常的處理流程 二、自定義異常類 1、實現自定義異常類 一、異常的處理&#xff08;續&#xff09; 1、異常的捕獲-try-catch捕…

自建開發工具IDE(一)之拖找排版—仙盟創夢IDE

自建拖拽布局排版在 IDE 中的優勢及初學者開發指南在軟件開發領域&#xff0c;用戶界面&#xff08;UI&#xff09;的設計至關重要。自建拖拽布局排版功能為集成開發環境&#xff08;IDE&#xff09;帶來了諸多便利&#xff0c;尤其對于初學者而言&#xff0c;是踏入開發領域的…