HashSet 的底層原理(簡單易懂)

????????在 Java 集合框架中,HashSet 是一個非常常用的集合類,它提供了快速的元素查找和插入操作。那么,HashSet 的底層是如何實現這些高效操作的呢?本文將深入探討 HashSet 的底層原理。

一、HashSet 的基本概念

HashSet 是基于哈希表的 Set 接口的實現,它不允許集合中出現重復元素。當我們向 HashSet 中添加元素時,HashSet 會使用元素的哈希值來決定元素在集合中的存儲位置,這樣可以大大提高查找和插入的效率。

二、底層數據結構

HashSet 的底層實現依賴于 HashMap。在 HashSet 的源碼中,可以看到它實際上是通過一個 HashMap 來存儲元素的。當我們向 HashSet 中添加元素時,實際上是將元素作為鍵值對的鍵存入 HashMap 中,而值則是一個固定的 Object 對象(PRESENT)。


private transient HashMap<E,Object> map;// Dummy value to associate with an Object in the backing Mapprivate static final Object PRESENT = new Object();public HashSet() {map = new HashMap<>();}public boolean add(E e) {return map.put(e, PRESENT)==null;}

三、哈希值的作用

哈希值是 HashSet 實現高效操作的關鍵。當我們向 HashSet 中添加元素時,HashSet 首先會計算元素的哈希值,然后根據哈希值確定元素在哈希表中的存儲位置。如果兩個元素的哈希值相同,那么它們就會被存儲在哈希表的同一個位置(稱為哈希沖突)。

四、解決哈希沖突

在實際應用中,哈希沖突是不可避免的。為了解決哈希沖突,HashMap(HashSet 底層使用的是 HashMap)采用了鏈地址法。具體來說,當發生哈希沖突時,HashMap 會將沖突的元素存儲在一個鏈表中,這個鏈表被稱為桶(bucket)。在 Java 8 及以后的版本中,如果鏈表的長度超過一定閾值(默認為 8),鏈表會被轉換為紅黑樹,以提高查找效率。

五、HashSet 的操作原理

  1. 添加元素:當我們調用 HashSet 的 add 方法添加元素時,HashSet 會先計算元素的哈希值,然后根據哈希值確定元素在哈希表中的存儲位置。如果該位置為空,直接將元素存入;如果該位置已存在元素(即發生哈希沖突),則將新元素添加到鏈表或紅黑樹中。
  1. 查找元素:當我們調用 HashSet 的 contains 方法查找元素時,HashSet 同樣會先計算元素的哈希值,然后根據哈希值確定元素在哈希表中的存儲位置。如果該位置為空,說明元素不存在;如果該位置存在元素,則在鏈表或紅黑樹中查找該元素。
  1. 刪除元素:當我們調用 HashSet 的 remove 方法刪除元素時,HashSet 會先計算元素的哈希值,然后根據哈希值確定元素在哈希表中的存儲位置。如果該位置存在元素,則在鏈表或紅黑樹中刪除該元素。

六、總結

HashSet 的底層原理基于哈希表和 HashMap,通過哈希值來快速定位元素的存儲位置,并使用鏈地址法解決哈希沖突。了解 HashSet 的底層原理,有助于我們在實際編程中更好地使用它,提高程序的性能。

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

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

相關文章

【學習資源】時間序列數據分析方法(2)-mWDN和AutoEncoder

接著上次的【學習資源】時間序列數據分析方法&#xff08;1&#xff09;-CSDN博客&#xff0c;本次介紹mWDN和AutoEncoder 解決時序數據分類的方法。介紹模型原理、應用場景和參考代碼。也從模型性能、訓練效率、模型復雜度、計算復雜度、可解釋性、適應性和泛化能力、健壯性、…

[LeetCode力扣hot100]-鏈表

相交鏈表 160. 相交鏈表 - 力扣&#xff08;LeetCode&#xff09; 思路就是遍歷兩個鏈表&#xff0c;有相同的部分就可以視為相交。 但是長度不一樣&#xff0c;比如兩個會相交的鏈表&#xff0c;headA 的長度為 a c&#xff0c;headB 的長度為 b c&#xff0c;其中 c 是公…

JAVA EE初階 - 預備知識(四)

一、API API 即應用程序編程接口&#xff08;Application Programming Interface&#xff09;&#xff0c;是一組定義、協議和工具&#xff0c;用于不同軟件組件、應用程序或系統之間進行交互和通信。以下從多個方面詳細介紹 API&#xff1a; 基本概念 接口規范&#xff1a;A…

【TI C2000】F28002x的系統延時、GPIO配置及SCI(UART)串口發送、接收

【TI C2000】F28002x的系統延時、GPIO配置及SCI&#xff08;UART&#xff09;串口發送、接收 文章目錄 系統延時GPIO配置GPIO輸出SCI配置SCI發送、接收測試附錄&#xff1a;F28002x開發板上手、環境配置、燒錄及TMS320F280025C模板工程建立F28002x敘述燒錄SDK庫文件說明工程建…

親測有效!使用Ollama本地部署DeepSeekR1模型,指定目錄安裝并實現可視化聊天與接口調用

文章目錄 一、引言二、準備工作&#xff08;Ollama 工具介紹與下載&#xff09;2.1 Ollama介紹2.2 Ollama安裝 三、指定目錄安裝 DeepSeek R1四、Chatbox 可視化聊天搭建4.1 Chatbox下載安裝4.2 關聯 DeepSeek R1 與 Chatbox 的步驟 五、使用 Ollama 調用 DeepSeek 接口5.1 請求…

期權隱含波動率是什么意思?

財順小編本文主要介紹期權隱含波動率是什么意思&#xff1f;期權隱含波動率&#xff08;Implied Volatility&#xff09;是根據當前期權市場價格&#xff0c;利用期權定價模型&#xff08;如Black-Scholes模型&#xff09;推導出的關于合約標的理論上的價格波動率。它反映了市場…

Python 面向對象的三大特征

前言&#xff1a;本篇講解面向對象的三大特征&#xff08;封裝&#xff0c;繼承&#xff0c;多態&#xff09;&#xff0c;還有比較細致的&#xff08;類屬性類方法&#xff0c;靜態方法&#xff09;&#xff0c;分步驟講解&#xff0c;比較適合理清楚三大特征的思路 面向對象的…

Jmeter如何計算TPS

1.在jmeter中計算出接口請求的個數 1175 1172 1172 174 200 416 384 1174 5867 2.計算接口平均響應時間 計算每個接口的請求次數乘以平均響應時間&#xff0c;所有接口相加&#xff0c;然后除以所有接口的數量總和&#xff0c;得到接口的平均響應時間 (1175*18191172*…

github上文件過大無法推送問題

GitHub 對文件大小有限制&#xff0c;超過 100 MB 的文件無法直接推送到倉庫中。 解決思路&#xff1a; 使用 Git Large File Storage (Git LFS) 來管理大文件不上傳對應的大文件 使用Git LFS&#xff1a; 1. 安裝 Git LFS 首先&#xff0c;你需要安裝 Git LFS。可以按照以…

Httprint 指紋識別技術:網絡安全的關鍵洞察

引言 Http指紋識別現在已經成為應用程序安全中一個新興的話題&#xff0c;Http服務器和Http應用程序安全也已經成為網絡安全中的重要一部分。從網絡管理的立場來看&#xff0c;保持對各種web服務器的監視和追蹤使得Http指紋識別變的唾手可得&#xff0c;Http指紋識別可以使得信…

docker push鏡像到阿里云

阿里云賬號 阿里云-計算&#xff0c;為了無法計算的價值 開通個人鏡像容器 進入控制臺&#xff0c;試用容器 實例列表界面 點擊上圖中的個人&#xff0c;個人版特性 創建個人版&#xff1a; 個人版實例界面&#xff1a; 設置密碼 個人版實例&#xff1a; 創建鏡像倉庫 如上…

【C#零基礎從入門到精通】(二十六)——C#三大特征-多態詳解

【C#零基礎從入門到精通】(二十六)——C#三大特征-多態詳解 在 C# 中,多態是面向對象編程的重要特性之一,它允許不同的對象對同一消息做出不同的響應。多態可以分為靜態多態和動態多態,下面將詳細介紹它們以及各自包含的知識點。 多態概述 多態性使得代碼更加靈活、可擴展…

大模型與智能體:螺旋共生,繪就智能新藍圖

大模型與智能體&#xff1a;螺旋共生&#xff0c;繪就智能新藍圖 在人工智能的前沿領域&#xff0c;大模型與智能體宛如兩顆璀璨的星辰&#xff0c;以一種精妙的螺旋共生關系&#xff0c;重塑著智能世界的格局&#xff0c;深刻影響著我們生活與工作的方方面面。 大模型&#x…

第2章 信息技術發展(一)

2.1 信息技術及其發展 2.1.1 計算機軟硬件 計算機硬件(Computer Hardware)是指計算機系統中由電子、機械和光電元件等組成的各種物理裝置的總稱。 計算機軟件 (Computer Software)是指計算機系統中的程序及其文檔&#xff0c;程序是計算任務的處理對象和處理規則的描述; 文檔…

藍橋杯篇---超聲波距離測量頻率測量

文章目錄 簡介第一部分&#xff1a;超聲波的簡介工作原理1.發射超聲波2.接收反射波3.計算時間差4.計算距離 硬件連接1.Trig2.Echo 示例代碼代碼說明注意事項1.聲速2.延時精度3.硬件連接 第二部分&#xff1a;頻率測量簡介頻率測量原理1.信號輸入2.計數3.計算頻率 硬件連接示例代…

CentOS系統docker配置鏡像加速registry-mirrors,配置阿里云和道客

1.可用倉庫 1.1.阿里云 2022年之后的鏡像缺失&#xff08;因為被墻了&#xff09;&#xff0c;但是網速極快 https://g4f7bois.mirror.aliyuncs.com1.2.上海道客 持續更新&#xff0c;但是網速極慢 https://docker.m.daocloud.io2.CentOS配置腳本 注意順序。阿里云的放前…

DeepSeek24小時寫作機器人,持續創作高質量文案

內容創作已成為企業、自媒體和創作者的核心競爭力。面對海量的內容需求&#xff0c;人工創作效率低、成本高、質量參差不齊等問題日益凸顯。如何在有限時間內產出高質量內容&#xff1f;DeepSeek寫作機器人&#xff0c;一款24小時持續創作的智能工具&#xff0c;為企業和個人提…

【Elasticsearch】simple_query_string

Elasticsearch 的simple_query_string查詢是一種靈活且容錯性較強的查詢方式&#xff0c;它允許用戶通過簡單的語法構造查詢字符串&#xff0c;以實現對文檔的搜索。以下是關于simple_query_string查詢的詳細說明&#xff1a; 1.基本概念 simple_query_string查詢是一種基于字…

CPP集群聊天服務器開發實踐(五):nginx負載均衡配置

1 負載均衡器的原理與功能 單臺Chatserver可以容納大約兩萬臺客戶端同時在線聊天&#xff0c;為了提升并發量最直觀的辦法需要水平擴展服務器的數量&#xff0c;三臺服務器可以容納六萬左右的客戶端。 負載均衡器的作用&#xff1a; 把client的請求按照負載均衡算法分發到具體…

MYSQL中的性能調優方法

MySQL性能調優是數據庫管理的重要工作之一&#xff0c;目的是通過調整系統配置、優化查詢語句、合理設計數據庫架構等方法&#xff0c;提高數據庫的響應速度和處理能力。以下是常見的MySQL性能調優方法&#xff0c;結合具體的案例進行說明。 1. 優化查詢語句 查詢語句是數據庫…