Java基礎 Day20

一、HashSet 集合類

1、簡介

HashSet 集合底層采取哈希表存儲數據

底層是HashMap

不能使存取有序

JDK8之前的哈希表是數組和鏈表,頭插法

JDK8之后的哈希表是數組、鏈表和紅黑樹,尾插法

2、存儲元素

(1)如果要保證元素的唯一性,需要同時重寫對象中的 hashCode 方法和 equals 方法

因為Object類的hashCode方法是調用底層的C++代碼計算了一個隨機數

(2)hashCode方法計算哈希值,equals方法比較元素

當添加對象的時候, 會先調用對象的hashCode方法計算出一個應該存入的索引位置, 查看該位置上是否存在元素

不存在:直接存

存在:調用equals方法比較內容

false:存

true:不存

3、底層原理細節(JDK8及以后)

(1)哈希擾動

底層會先計算出原始哈希值,設為 h

計算 h ^ ( h >> 16 ) 作為新的哈希值

以減少哈希沖突

(2)取模運算

用最終的哈希值對底層數組長度取模,得到索引位置

初始數組長度為16

計算時,并不是直接 H % 16

而是?( 16 - 1 ) & H

對16取模相當于取后四位,和1111做與運算也是取后四位

與運算的效率高于取模運算

(3)數組擴容與樹化操作

擴容數組的條件:

當數組中的元素個數到達了 16 * 0.75 (加載因子) = 12,擴容到原數組 2 倍的大小

鏈表掛載的元素超過了8 (閾值) 個 , 并且數組長度沒有超過64

鏈表轉紅黑樹的條件:

鏈表掛載的元素超過了8 (閾值) 個, 并且數組長度到達了64

二、LinkedHashSet 集合類

1、簡介

存取有序、去重、無索引

2、原理

底層數據結構是依然哈希表,只是每個元素又額外的多了一個雙鏈表的機制記錄存儲的順序

三、幾種單列集合的選擇

1、元素可重復,用 ArrayList(最常用)

2、元素可重復,且增刪多于查詢,用LInkedList

3、元素不重復,用HashSet(最常用)

4、不重復且存取有序,用LinkedHashSet

5、想對元素排序,用TreeSet

四、可變參數

可變參數用在形參中可以接收多個數據

可變參數的格式:數據類型...參數名稱

傳輸參數非常靈活,方便,可以不傳輸參數,可以傳輸1個或者多個,也可以傳輸一個數組

可變參數在方法內部本質上就是一個數組

注意:一個形參列表中可變參數只能有一個,可變參數必須放在形參列表的最后面

public static void main(String[] args) {System.out.println(add(1)); // 1System.out.println(add(1,2,3)); // 6int[] arr = {1,2,3,4};System.out.println(add(arr)); // 10
}public static int add(int... nums) {int sum = 0;for (int num : nums) {sum += num;}return sum;
}

五、Collections 集合工具類

Collections并不屬于集合,是用來操作集合的工具類

public?static?<T>?boolean?addAll(Collection<??super?T>?c,?T...?elements)

給集合對象批量添加元素

public?static?void?shuffle(List<?>?list)?

打亂List集合元素的順序

public static <T> int binarySearch?(List<T> list, ?T key)

以二分查找法查找元素

public static <T> void max/min(Collection<T> coll)

根據默認的自然排序獲取最大/小值

public static <T> void swap(List<?> list, int i, int j)

交換集合中指定位置的元素

public static <T> void sort(List<T> list)

將集合中元素按照默認規則排序

public static <T> void sort(List<T> list,Comparator<? super T> c)

將集合中元素按照指定規則排序

六、Map 接口

1、Map 集合

Map 集合是一種雙列集合,每個元素包含兩個數據

Map 集合的每個元素的格式:key = value(鍵值對元素)

key (鍵):不允許重復

value (值):允許重復

鍵和值是一一對應的,每個鍵只能找到自己對應的值

key + value 這個整體稱為“鍵值對”或者“鍵值對對象”,在Java中使用Entry對象表示

2、常用方法

Map是雙列集合的頂層接口,它的功能是全部雙列集合都可以繼承使用的

V?put(K?key,V?value)

添加元素,若鍵已存在,則覆蓋原值,返回被覆蓋的值

V?remove(Object?key)

根據鍵刪除鍵值對元素

void?clear()

移除所有的鍵值對元素

boolean?containsKey(Object?key)

判斷集合是否包含指定的鍵

boolean?containsValue(Object?value)

判斷集合是否包含指定的值

boolean?isEmpty()

判斷集合是否為空

int?size()

集合的長度,也就是集合中鍵值對的個數

3、特點

雙列集合底層的數據結構都是針對于鍵有效,和值無關

HashMap:鍵唯一(重寫hashCode方法和equals方法)

TreeMap:鍵排序(實現comparable接口并重寫compareTo方法)

LinkedHashMap:鍵唯一且存取有序

4、遍歷方式

(1)通過鍵找值

V?get(Object?key)?

根據鍵查找對應的值

Set<K>?keySet()?

獲取?Map?集合中所有的鍵

(2)通過鍵值對對象獲取鍵和值

Set<Map.Entry<K,V>>?entrySet()?

獲取集合中所有的鍵值對對象

(3)通過 forEach 方法遍歷

default?void?forEach?

(BiConsumer<??super?K, ??super?V>?action)?

遍歷Map集合,?獲取鍵和值

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

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

相關文章

2505C++,32位轉64位

原文 假設有個想要將一個32位值傳遞給一個帶64位值的函數的函數.你不關心高32位的內容,因為該值是傳遞給回調函數的直通值,回調函數會把它截斷為32位值. 因此,你都擔心編譯器一般生成的將32位值擴展到64位值的那條指令的性能影響. 我懷疑這條指令不是程序中的性能瓶頸. 我想出…

光伏電站及時巡檢:守護清潔能源的“生命線”

在“雙碳”目標驅動下&#xff0c;光伏電站作為清潔能源的主力軍&#xff0c;正以年均20%以上的裝機增速重塑全球能源格局。然而&#xff0c;這些遍布荒漠、屋頂的“光伏矩陣”并非一勞永逸的能源提款機&#xff0c;其穩定運行高度依賴精細化的巡檢維護。山東棗莊觸電事故、衢州…

C++初階-list的使用2

目錄 1.std::list::splice的使用 2.std::list::remove和std::list::remove_if的使用 2.1remove_if函數的簡單介紹 基本用法 函數原型 使用函數對象作為謂詞 使用普通函數作為謂詞 注意事項 復雜對象示例 2.2remove與remove_if的簡單使用 3.std::list::unique的使用 …

OpenHarmony平臺驅動使用(一),ADC

OpenHarmony平臺驅動使用&#xff08;一&#xff09; ADC 概述 功能簡介 ADC&#xff08;Analog to Digital Converter&#xff09;&#xff0c;即模擬-數字轉換器&#xff0c;可將模擬信號轉換成對應的數字信號&#xff0c;便于存儲與計算等操作。除電源線和地線之外&#…

CSS【詳解】彈性布局 flex

適用場景 一維&#xff08;行或列&#xff09;布局 基本概念 包裹所有被布局元素的父元素為容器 所有被布局的元素為項目 項目的排列方向&#xff08;垂直/水平&#xff09;為主軸 與主軸垂直的方向交交叉軸 容器上啟用 flex 布局 將容器的 display 樣式設置為 flex 或 i…

基于MATLAB實現傳統譜減法以及兩種改進的譜減法(增益函數譜減法、多帶譜減法)的語音增強

基于MATLAB實現傳統譜減法以及兩種改進的譜減法&#xff08;增益函數譜減法、多帶譜減法&#xff09;的語音增強代碼示例&#xff1a; 傳統譜減法 function enhanced traditional_spectral_subtraction(noisy, fs, wlen, inc, NIS, a, b)% 參數說明&#xff1a;% noisy - 帶…

symbol【ES6】

你一閉眼世界就黑了&#xff0c;你不是主角是什么&#xff1f; 目錄 什么是Symbol&#xff1f;?Symbol特點?&#xff1a;創建方法&#xff1a;注意點&#xff1a;不能進行運算&#xff1a;顯示調用toString() --沒有意義隱式轉換boolean 如果屬性名沖突了怎么辦&#xff1f;o…

LeetCode 649. Dota2 參議院 java題解

https://leetcode.cn/problems/dota2-senate/description/ 貪心。不會寫。 class Solution {public String predictPartyVictory(String senate) {boolean rtrue,dtrue;int flag0;//flag>0,d前面有r;flag<0,r前面有dchar[] senatessenate.toCharArray();//每一輪while(r…

機器學習第二十二講:感知機 → 模仿大腦神經元的開關系統

機器學習第二十二講&#xff1a;感知機 → 模仿大腦神經元的開關系統 資料取自《零基礎學機器學習》。 查看總目錄&#xff1a;學習大綱 關于DeepSeek本地部署指南可以看下我之前寫的文章&#xff1a;DeepSeek R1本地與線上滿血版部署&#xff1a;超詳細手把手指南 感知機詳解…

maven快速上手

之前我們項目如果要用到其他額外的jar包&#xff0c;需要自己去官網下載并且導入。但是有maven后&#xff0c;直接在maven的pom.xml文件里用代碼配置即可&#xff0c;配置好后maven會自動幫我們聯網下載并且會自動導入該jar包 在右邊的maven中&#xff0c;我們可以看到下載安裝…

科學養生指南:解鎖健康生活密碼

健康是人生最寶貴的財富&#xff0c;在快節奏的現代生活中&#xff0c;科學養生成為保持良好狀態的關鍵。遵循現代醫學與營養學的研究成果&#xff0c;無需依賴傳統中醫理論&#xff0c;我們也能找到適合自己的養生之道。? 均衡飲食是健康的基石。現代營養學強調 “食物多樣&…

Qt狀態機QStateMachine

QStateMachine QState 提供了一種強大且靈活的方式來表示狀態機中的狀態&#xff0c;通過與狀態機類(QStateMachine)和轉換類(QSignalTransition&#xff0c; QEventTransition)結合&#xff0c;可以實現復雜的狀態邏輯和用戶交互。合理使用嵌套狀態機、信號轉換、動作與動畫、…

C++八股 —— 原子操作

文章目錄 1. 什么是原子操作2. 原子操作的特點3. 原子操作的底層原理4. 內存序內存屏障 5. 原子操作和互斥鎖的對比6. 常用的原子操作7. 相關問題討論 參考&#xff1a; C atomic 原子操作_c 原子操作-CSDN博客DeepSeek 1. 什么是原子操作 原子操作&#xff08;Atomic Opera…

雙紫擒龍紫紫紅指標源碼學習,2025升級版紫紫紅指標公式-重點技術

VAR1:MA((LOWHIGHCLOSE)/3,5); VAR2:CLOSEHHV(C,4) AND REF(C,1)LLV(C,4); 雙紫擒龍:REF(C,1)LLV(C,4) AND C>REF(C,2) OR REF(C,2)LLV(C,4) AND REF(C,1)<REF(C,3) AND REF(C,2)<REF(C,4) AND C>REF(C,1); VAR4:VAR1>REF(VAR1,1) AND REF(VAR1,1)<REF(VAR1,…

NeuralRecon技術詳解:從單目視頻中實現三維重建

引言 三維重建是計算機視覺領域中的一項關鍵技術&#xff0c;它能夠從二維圖像中恢復出三維形狀和結構。隨著深度學習的發展&#xff0c;基于學習的方法已經成為三維重建的主流。NeuralRecon是一種先進的三維重建方法&#xff0c;它能夠從單目視頻中實時生成高質量的三維模型。…

Ubuntu 上開啟 SSH 服務、禁用密碼登錄并僅允許密鑰認證

1. 安裝 OpenSSH 服務 如果尚未安裝 SSH 服務&#xff0c;運行以下命令&#xff1a; sudo apt update sudo apt install openssh-server2. 啟動 SSH 服務并設置開機自啟 sudo systemctl start ssh sudo systemctl enable ssh3. 生成 SSH 密鑰對&#xff08;本地機器&#xf…

MySQL 索引的增刪改查

MySQL 索引的增刪改查 1 建表時創建索引 [UNIQUE|FULLTEXT|SPATIAL] INDEX|KEY [別名] (字段名 [(長度)] [ASC|DESC] )主鍵直接寫&#xff1a; PRIMARY KEY (Id)例如&#xff1a; CREATE TABLE people (id int NOT NULL PRIMARY KEY AUTO_INCREMENT,last_name varchar(10)…

為什么現代CSS應該選擇OKLCH:從顏色科學到設計系統革新

在數字界面中&#xff0c;顏色不僅是美學的載體&#xff0c;更是信息傳遞的重要工具。CSS Color Level 4 標準引入了 OKLCH 顏色空間, 提供??感知均勻性??&#xff08;顏色差異與實際視覺感受一致&#xff09;&#xff0c;解決傳統HSL/HSV在調整顏色時的不自然問題。文本幫…

【java】小練習--零錢通

文章目錄 前言一、項目開發流程說明二、功能實現2.1 菜單2.2 零錢通明細2.3 零錢通收益2.4 零錢通消費2.5 零錢通退出確認2.6 零錢通金額校驗2.7 完整代碼 三、零錢通OOP版 前言 本文是我跟著B站韓順平老師的 Java 教程學習時動手實現“零錢通”項目的學習筆記&#xff0c;主要…

人工智能數學基礎實驗(四):最大似然估計的-AI 模型訓練與參數優化

一、實驗目的 理解最大似然估計&#xff08;MLE&#xff09;原理&#xff1a;掌握通過最大化數據出現概率估計模型參數的核心思想。實現 MLE 與 AI 模型結合&#xff1a;使用 MLE 手動估計樸素貝葉斯模型參數&#xff0c;并與 Scikit-learn 內置模型對比&#xff0c;深入理解參…