Java(Set接口和HashSet的分析)

Set 接口基本介紹:

注意:取出的順序的順序雖然不是添加的順序,但是他的固定

set接口的常用方法:

和 List 接口一樣, Set 接口也是 Collection 的子接口,因此,常用方法和 Collection 接口一樣.

set的遍歷方式:

HashSet的全面說明:

HashSet的暢通方法解析:

1. 在執行 add 方法后,會返回一個 boolean 值
2. 如果添加成功,返回 true, 否則返回 false
3. 可以通過 remove 指定刪除哪個對象? ?如:

HashSet set = new HashSet();

set.remove("john");

HashSet的源碼分析:

代碼:

HashSet hashSet = new HashSet();
hashSet.add("java");//到此位置,第 1 次 add 分析完畢.
hashSet.add("php");//到此位置,第 2 次 add 分析完畢
hashSet.add("java");
System.out.println("set=" + hashSet);

源碼分析:

1. 構造器走的源碼
public HashSet() {
map = new HashMap<>();
}

2. 執行 add()
public boolean add(E e) {//e = "java"
return map.put(e, PRESENT)==null;//(static) PRESENT = new Object();
}
3.執行 put() , 該方法會執行 hash(key) 得到 key 對應的 hash 值 算法 h = key.hashCode()) ^ (h >>> 16)
public V put(K key, V value) {//key = "java" ,value = PRESENT 共享
return putVal(hash(key), key, value, false, true);
}

4.執行 putVal
final V putVal(int hash, K key, V value, boolean onlyIfAbsent,boolean evict) {
Node<K,V>[] tab; Node<K,V> p; int n, i; //定義了輔助變量
//table 就是 HashMap 的一個數組,類型是 Node[]
//if 語句表示如果當前 table 是 null, 或者 大小=0
//就是第一次擴容,到 16 個空間.
if ((tab = table) == null || (n = tab.length) == 0)
n = (tab = resize()).length;
//(1)根據 key,得到 hash 去計算該 key 應該存放到 table 表的哪個索引位置
//并把這個位置的對象,賦給 p
//(2)判斷 p 是否為 null
//(2.1) 如果 p 為 null, 表示還沒有存放元素, 就創建一個 Node (key="java",value=PRESENT)
//(2.2) 就放在該位置 tab[i] = newNode(hash, key, value, null)
if ((p = tab[i = (n - 1) & hash]) == null)
ab[i] = newNode(hash, key, value, null);
else {
//一個開發技巧提示: 在需要局部變量(輔助變量)時候,在創建
Node<K,V> e; K k; //
//如果當前索引位置對應的鏈表的第一個元素和準備添加的 key 的 hash 值一樣
//并且滿足 下面兩個條件之一:
//(1) 準備加入的 key 和 p 指向的 Node 結點的 key 是同一個對象
//(2) p 指向的 Node 結點的 key 的 equals() 和準備加入的 key 比較后相同就不能加入

? ? ? ? ? ? ? if (p.hash == hash &&((k = p.key) == key || (key != null && key.equals(k))))
e = p;
//再判斷 p 是不是一顆紅黑樹,
//如果是一顆紅黑樹,就調用 putTreeVal , 來進行添加
else if (p instanceof TreeNode)
e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);
else {//如果 table 對應索引位置,已經是一個鏈表, 就使用 for 循環比較
//(1) 依次和該鏈表的每一個元素比較后,都不相同, 則加入到該鏈表的最后
// 注意在把元素添加到鏈表后,立即判斷 該鏈表是否已經達到 8 個結點
// , 就調用 treeifyBin() 對當前這個鏈表進行樹化(轉成紅黑樹)
// 注意,在轉成紅黑樹時,要進行判斷, 判斷條件
// if (tab == null || (n = tab.length) < MIN_TREEIFY_CAPACITY(64))
// resize();
// 如果上面條件成立,先 table 擴容.
// 只有上面條件不成立時,才進行轉成紅黑樹
//(2) 依次和該鏈表的每一個元素比較過程中,如果有相同情況,就直接 break
for (int binCount = 0; ; ++binCount) {
if ((e = p.next) == null) {
p.next = newNode(hash, key, value, null);
if (binCount >= TREEIFY_THRESHOLD(8) - 1) // -1 for 1st
treeifyBin(tab, hash);
break;
}
if (e.hash == hash &&((k = e.key) == key || (key != null && key.equals(k))))
break;
p = e;
}
}
if (e != null) { // existing mapping for key
V oldValue = e.value;
if (!onlyIfAbsent || oldValue == null)
e.value = value;
afterNodeAccess(e);
return oldValue;
}
}
++modCount;
//size 就是我們每加入一個結點 Node(k,v,h,next), size++
if (++size > threshold)
resize();//擴容
afterNodeInsertion(evict);
return null;
}
*/
}
}

當我們向 hashset 增加一個元素,-> Node -> 加入 table , 就算是增加了一個 size++

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

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

相關文章

vscode不識別vsix結尾的插件怎么解決?

當VS Code無法識別.vsix文件時&#xff0c;可能是由于文件損壞、版本不兼容或安裝流程不正確導致的。以下是解決此問題的詳細步驟&#xff1a; 1. 確認文件完整性 重新下載.vsix文件&#xff1a;刪除現有文件&#xff0c;從可靠來源重新下載&#xff0c;確保下載過程未中斷。檢…

面試題:sql題一

SELECTp.product_id, -- 產品IDp.product_name, -- 產品名稱SUM(s.sale_qty * s.unit_price) AS sum_price, -- 年銷售總價YEAR(s.sale_date) AS year_date -- 銷售年份 FROM products p JOIN sales s ON p.product_id s.produ…

【React-Three-Fiber實踐】放棄Shader!用頂點顏色實現高性能3D可視化

在現代前端開發中&#xff0c;3D可視化已經成為提升用戶體驗的重要手段。然而&#xff0c;許多開發者在實現復雜視覺效果時&#xff0c;往往會首先想到使用Shader&#xff08;著色器&#xff09;。雖然Shader功能強大&#xff0c;但學習曲線陡峭&#xff0c;實現復雜度高。本文…

MSTP技術

一、STP/RSTP 的局限性STP&#xff08;生成樹協議&#xff09;和 RSTP&#xff08;快速生成樹協議&#xff09;存在一些明顯的局限&#xff0c;主要包括&#xff1a;所有 VLAN 共享一顆生成樹&#xff0c;這導致無法實現不同 VLAN 在多條 Trunk 鏈路上的負載分擔。例如&#xf…

[IMX][UBoot] 16.Linux 內核移植

目錄 1.修改 Makefile 2.新增配置文件 3.新增設備樹文件 4.新建編譯腳本 5.修改 CPU 頻率 6.EMMC 適配 7.網絡驅動適配 1.修改 Makefile 修改頂層 Makefile 中的架構信息 ARCH 和交叉編譯器 CROSS_COMPILE&#xff0c;修改后不需要在執行 make 時手動指定這兩個變量的值…

數據庫 × 緩存雙寫策略深度剖析:一致性如何保障?

前言 緩存&#xff0c;幾乎是現在互聯網項目中最常見的一種加速工具了。 通過緩存&#xff0c;我們能大幅提升接口響應速度&#xff0c;減少數據庫的訪問壓力&#xff0c;還能支撐各種復雜的業務功能&#xff0c;比如排行榜、風控系統、黑名單校驗等等。 不管你用的是本地緩存…

主流Java Redis客戶端深度對比:Jedis、Lettuce與Redisson性能特性全解析

&#x1f49d;&#x1f49d;&#x1f49d;歡迎蒞臨我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 持續學習&#xff0c;不斷…

AI問答系統完整架構規劃文檔

?? 目錄 現有代碼架構分析 AI核心組件缺口分析 完整技術架構設計 開發路線圖 技術實現要點 ??? 現有代碼架構分析 當前項目結構 ai問答/ ├── main.py # FastAPI服務入口,API路由 ├── model.py # 基礎LLM模型加載與推理 ├── rag.py …

圓柱電池自動分選機:全流程自動化檢測的革新之路

在新能源產業快速發展的背景下&#xff0c;圓柱電池作為動力電池和儲能領域的核心組件&#xff0c;其生產效率與質量把控至關重要。圓柱電池自動分選機的出現&#xff0c;通過全流程自動化檢測技術&#xff0c;為電池制造與分選環節提供了高效、精準的解決方案。傳統電池分選依…

leetcode 1695. 刪除子數組的最大得分 中等

給你一個正整數數組 nums &#xff0c;請你從中刪除一個含有 若干不同元素 的子數組。刪除子數組的 得分 就是子數組各元素之 和 。返回 只刪除一個 子數組可獲得的 最大得分 。如果數組 b 是數組 a 的一個連續子序列&#xff0c;即如果它等于 a[l],a[l1],...,a[r] &#xff0c…

netty的編解碼器,以及內置的編解碼器

一、編碼器和解碼器 1、什么是編碼和解碼 解碼常用于入站操作&#xff0c;將字節轉換為消息。編碼用于出站&#xff0c;將消息轉換為字節流 2、解碼器ByteToMessageDecoder和ReplayingDecoder&#xff0c;ReplayingDecoder擴展了ByteToMessageDecoder類&#xff0c;使得我們不必…

一個基于現代C++智能指針的優雅內存管理解決方案

目錄 問題陳述 (Problem Statement) 1.1 問題背景與動機1.2 問題復雜性分析1.3 傳統解決方案的局限性1.4 目標需求定義 預備知識 (Preliminaries) 2.1 C智能指針基礎2.2 循環引用問題詳解2.3 自定義刪除器2.4 引用計數機制深入理解 核心解決方案 (Core Solution) 3.1 設計思路…

LabVIEW單片機溫控

基于 LabVIEW 與單片機設計溫度控制系統&#xff0c;整合硬件電路、串口通信、控制算法及監控功能&#xff0c;適用于教學實驗及中小型設備溫控場景。系統以低成本實現高精度溫控&#xff0c;為同類控制系統設計提供參考。應用場景教學場景&#xff1a;作為自動化專業綜合實驗項…

【初識數據結構】CS61B中的最小生成樹問題

本教程總結CS61B 關于圖章節中的最小生成樹&#xff08;Minimum Spanning Trees, MST&#xff09;問題&#xff0c;以及對應的的算法什么是最小生成樹&#xff08;MST&#xff09; 考慮這樣一個問題&#xff0c;給你一個無向圖&#xff0c;你能不能找出這個圖中的一組邊&#x…

vue apk返回鍵不好使

在 Android 設備上&#xff0c;你可以通過監聽物理返回鍵來實現特定的邏輯。這可以通過在 Vue 組件中添加一個事件監聽器來實現&#xff1a;mounted() {this.$once(hook:beforeDestroy, () > {if (document.removeEventListener) {document.removeEventListener(backbutton,…

Ubuntu 22.04 安裝 MySQL 8.0 完整步驟文檔

1、安裝 1.1、下載 cd /usr/local/在 /usr/local/ 下執行&#xff0c;下載資源包&#xff0c;可以本地下載上傳 wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.32-linux-glibc2.12-x86_64.tar.xz1.2、解壓安裝 tar -Jxvf mysql-8.0.32-linux-glibc2.…

Docker,其他機器下載鏡像并copy到目標機器導入docker鏡像

Docker&#xff0c;其他機器下載鏡像并copy到目標機器導入docker鏡像源機器 【下載鏡像】目標機器slave1 【無法下載鏡像】步驟 1&#xff1a;在網絡正常的機器&#xff08;cg&#xff09;上下載鏡像&#xff0c;導出鏡像到指定路徑# 1. 下載鏡像docker pull ubuntu:20.04# 2.…

基于現代R語言【Tidyverse、Tidymodel】的機器學習方法與案例分析

機器學習已經成為繼理論、實驗和數值計算之后的科研“第四范式”&#xff0c;是發現新規律&#xff0c;總結和分析實驗結果的利器。機器學習涉及的理論和方法繁多&#xff0c;編程相當復雜&#xff0c;一直是阻礙機器學習大范圍應用的主要困難之一&#xff0c;由此誕生了Python…

如何將 git 遠程 URL 從 https 更改為 ssh

在項目開發中&#xff0c;使用 SSH 連接 Git 倉庫可以提高安全性和便利性。本文將指導你如何將 Git 遠程 URL 從 HTTPS 更改為 SSH。操作指南步驟 1: 查看當前遠程 URL首先&#xff0c;確認當前的遠程 URL 使用的是 https。打開終端并輸入以下命令&#xff1a;git remote -v如&…

PyCharm 高效入門指南(核心模塊詳解二)

四、生產力工具集成PyCharm 不僅僅是 Python 編輯器&#xff0c;更是集成了多種開發工具的綜合平臺。通過內置的生產力工具&#xff0c;開發者可以在一個界面內完成數據庫操作、科學計算、遠程開發和測試等全流程工作&#xff0c;避免工具切換帶來的效率損耗。4.1 數據庫工具鏈…