24、Java 集合

十一章:Java 集合


一、集合框架的概述

1、集合:就像一個容器,可以動態的把多個對象的引用放入容器中。簡稱 Java 容器

? 說明:此時的存儲,主要指的是內存層面的存儲,不涉及到持續化的存儲(.txt, .jpg, avi,數據庫中)

2、數組在存儲多個數據方面的特點:

? >一旦初始化之后,長度就確定了

? >一旦定義好,其元素的類型就確定了。我們只能操作指定類型的數據。比如: String[] arr; int[] arr1;

? 數組在存儲多個數據方面的缺點:

? >一旦初始化,其長度就不可修改

? >數組中提供的方法非常有限,對于添加、刪除、插入數據等操作非常不便,效率也不高

? >獲取數據中實際元素個數的需求,數據沒有線程的屬性或方法可用

? >數組存儲數據的特點:有序、可重復。對于無序的、不可重復的需求,無法滿足


二、集合框架:Collection 與 Map

CleanShot 2025-03-01 at 13.17.27

List ---->“動態”數組

Set----->高中講的“集合”

Map---->高中函數: y=f(x) 可以 key 多對一 value 不可以 key 一對多 value


三、Collection 接口中的 方法的使用

CleanShot 2025-03-01 at 13.35.36

CleanShot 2025-03-01 at 13.35.57

像 Collection 接口的實現類中的對象中添加數據 obj 時,要求 obj 所在類要重寫 equals

package com.java.kcw1;import org.junit.Test;import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;/**集合元素的遍歷操作,使用 Iterator* @author Jackson_kcw* @Time 2025-03-01  PM1:52*/
public class InteratorTest {@Testpublic void test1() {Collection coll1=new ArrayList();coll1.add("a");coll1.add("b");coll1.add("c");coll1.add(false);Iterator iterator = coll1.iterator();
//        System.out.println(iterator.next());
//        System.out.println(iterator.next());
//        System.out.println(iterator.next());
//        System.out.println(iterator.next());//遍歷操作while(iterator.hasNext()) {//next(): 指針下移;將下移以后集合位置上的元素返回System.out.println(iterator.next());}}
}

集合對象每次調用 iterator()方法都得到一個全新的迭代器對象,默認游標都在集合的第一個元素之前

內部定義了 remove(),可以在遍歷的時候,刪除集合中的元素。此方法不同于直接嗲用 remove

For-each

package com.java.kcw1;import org.junit.Test;import java.util.ArrayList;
import java.util.Collection;/**JDK5.0新增 foreach 循環,用于* @author Jackson_kcw* @Time 2025-03-01  PM2:19*/
public class ForTest {@Testpublic void test() {Collection coll=new ArrayList();coll.add("AA");coll.add("BB");coll.add(11); //自動裝箱System.out.println(coll.size());//for( 集合元素的類型 局部變量:集合對象)for(Object obj:coll){System.out.println(obj);}}
}

List 接口概述:List 集合了類元素有序、可重復

面試題目:ArrayList\LinkedList\Vector 三者的異同

同:三個類都實現了 List 接口,存儲數據的特點相同:元素有序、可重復

異:

ArrayList::作為 List 接口的主要實現類,線程不安全,效率高

LinkedList:對于頻繁的插入和刪除操作,使用效率比 ArrayList 高,底層使用雙向鏈表存儲

Vector:作為 List 接口的古老實現類;線程安全,效率低

List 接口中的常用方法

CleanShot 2025-03-01 at 14.42.47

總結常用方法:

增:add(Object obj)

刪:remove(int index) / remove(Object obj)

改:set(int index,Object ele)

查:get(int index)

插:add(int index,Object ele)

長度:size()

遍歷:一、Iterator 迭代器方式 二、for each 三、普通的循環


Set接口:存儲無序的、不可重復的數據 —>高中講的集合

? HashSet: 作為 Set 接口的主要實現類;線程不安全;可以存儲 null 值

? LinkedHashSet:作為 HashSet 子類;遍歷其內部數據時,可以按照添加的順序遍歷

? TreeSet:可以按照添加對象的指定屬性,進行排序

Set 接口沒有額外一些方法,使用的都是 Collection 里面聲明的方法

Set

以 HashSet 為例:

1、無序性:不等于隨機性。存儲的數據在底層數組中并非按照數據所以你的順序添加,而是根據數據的 hash 值來確定的

2、不可重復性:保證添加的元素按照 equals()方法判斷時,不能返回 true.即相同的元素只能添加一個

二、添加元素的過程:以 HashSet 為例:

? 我們向 HashSet 添加元素 a,首先調用元素a 所在類的 hashCode()方法,計算 a 的哈希值,此哈希值接著通過某種算法計算出在 HashSet 底層數組中的存放完位置(即為:索引位置),判斷數組在此位置是否已經有元素:

? 如果此位置上沒有其他元素,則元素 a 添加成功

? 如果此位置有元素 b,則比較元素 a 與元素 b 的 哈希值:

? 如果 hash 值不同,則元素 a 添加成功

? 如果 hash 值相同,賊需要調用元素 a 所在類的 equals()方法:equals()返回 true,元素 a 添加失敗

? equals()返回 false,則元素 a 添加成功


向 TreeSet 里面添加的數據,要求是相同類的對象,不能添加不同類的對象



五、Map 接口


5-1、|—Map:雙列數據,存儲 key-value 的值 ---------類似高中的函數 :y=f(x)

? |—HashMap:作為 Map 的主要實現類;線程不安全,效率高;可以存儲 null 的 key 和 value

? |----LinkedHashMap:保證在遍歷 map 元素時,可以按照添加的順序實現遍歷

? |—TreeMap:保證按照添加的 key-value 對 進行排序,實現排序遍歷。此時考慮 key 的自然排序或定制排序

? | —Hashtable:作為古老的實現類;線程安全,效率低;不可存儲 null 的 key 和 value

? |—Properties:常用來處理配置文件。key 和 value 都是 String 類型

HashMap 的底層: 數組+鏈表(jdk7 及之前)

? 數組+鏈表+紅黑樹(jdk8)


5-2 Map 結構的理解

CleanShot 2025-03-01 at 16.32.48


5-3 HashMap 的底層實現原理

以 jdk7 為例說明:

HashMap map= new HashMap();

在實例化以后,底層創建了長度為 16 的一維數組 Entry[] table

…可能已經執行過多次 put…

map.put(key1,value1):

首先,調用 key1 所在類的 hashCode()計算 key1 哈希值,此哈希值經過某種算法計算以后,得到在 Entry 數組中的存放位置

如果此位置上的數據為空,此時的 key1-value1 添加成功

如果此位置的數據不為空,(意味著此位置上存在一個或多個數據(以鏈表形式存在)),比較 key1 和已經存在的一個或多個數據的哈希值:

? 如果 key1 的哈希值與已經存在的數據的哈希值都不相同,此時的 key1-value1 添加成功

? 如果 key1 的哈希值和已經存在的某一個數據(key2-value2)的哈希值相同,繼續比較:調用 key1 所在類的 equals()方法,比較:

? 如果 equals()返回 false:此時的 key1-value1 添加成功

? 如果 equals()返回 true: 使用 value1 替換value2

JDK8 相較于 7 在底層實現方面的不同:

1、new HashMap():底層沒有創建一個長度為 16 的數組

2、jdk8 底層的數組是:Node[],而非 Entry[]

3、首次調用 put 方法時,底層創建長度為 16 的數組

4、jdk7 底層結構只有數組加鏈表 jdk8 底層結構:數據+鏈表+紅黑樹

? 當數組的某一個索引位置上的元素以鏈表形式存在的數據個數>8 且當前數組的長度>64,此時索引位置上的所有數據改為使用紅黑樹存儲


CleanShot 2025-03-02 at 13.46.24

?這里面跳過了 hashMap 底層實現原理,這一部分講的比較復雜和抽象,本人因為時間原因跳過了,但是建議再找文檔或視頻看看


5-4 Map接口中常用的方法

CleanShot 2025-03-02 at 14.04.37

CleanShot 2025-03-02 at 14.07.58


工具類 Collections:操作 Collection、Map 的工具類

CleanShot 2025-03-02 at 14.18.22


面試題:Collections 與 Collection 的區別

對比項CollectionCollections
定義Collection 是 java 的接口Collections 是 Java 提供的工具類
作用定義了 Java 集合的基本操作,如 List、Set等的父接口提供集合操作的工具方法,如排序、搜索、線程安全包裝等
子類/實現方式List\Set\Queue 等結合框架的接口不能被繼承,只能直接調用其靜態方法
常見方法add()、remove()、size()等sort()、shuffle()、synchronizedList()等


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

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

相關文章

1114棋盤問題acwing(深度優先搜索)

題目描述 在一個給定形狀的棋盤(形狀可能是不規則的)上面擺放棋子,棋子沒有區別。 要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列,請編程求解對于給定形狀和大小的棋盤,擺放 kk 個棋子的所有可行的擺放…

logback日志輸出配置范例

logback日志輸出配置范例 在wutool中,提供了logback日志輸出配置范例,實現日志文件大小限制、滾動覆蓋策略、定時清理等功能。 關于wutool wutool是一個java代碼片段收集庫,針對特定場景提供輕量解決方案,只要按需選擇代碼片段…

測試人員如何驅動開發?

軟件開發中測試人員的作用正在從傳統的缺陷發現者演變為開發過程的主動推動者。特別是在敏捷和 DevSecOps 環境中,測試人員如何通過參與需求、提供反饋和推動自動化來驅動開發,成為一個值得探討的話題。本文將詳細分析測試人員驅動開發的具體方式&#x…

大模型語料庫的構建過程 包括知識圖譜構建 垂直知識圖譜構建 輸入到sql構建 輸入到cypher構建 通過智能體管理數據生產組件

以下是大模型語料庫的構建過程: 一、文檔切分語料庫構建 數據來源確定: 首先,需要確定語料庫的數據來源。這些來源可以是多種多樣的,包括但不限于: 網絡資源:利用網絡爬蟲技術從各種網站(如新聞…

oracle游標為什么沒有共享,統計一下原因

-- Script Code為什么沒共享 define sql_id bs391f0yq5tpw;set serveroutput onDECLAREv_count number;v_sql varchar2(500);v_sql_id varchar2(30) : &sql_id; BEGINv_sql_id : lower(v_sql_id);dbms_output.put_line(chr(13)||chr(10));dbms_output.put_line(sql_id: ||…

哈希碰撞攻防戰——深入淺出Map/Set的底層實現

各位看官早安午安晚安呀 如果您覺得這篇文章對您有幫助的話 歡迎您一鍵三連,小編盡全力做到更好 歡迎您分享給更多人哦 今天我們來學習Map/Set的底層實現 目錄 問題一:hash會出現負數?數組越界 一:什么是二叉搜索樹&#xff1f…

win10使用haneWIN NFS Server掛載NFS v2服務,u-boot通過NFS下載zImage

1. haneWIN NFS Server掛載NFS v2服務 https://www.hanewin.net/nfs-e.htm netstat -ano | findstr ":2049"TCP 0.0.0.0:2049 0.0.0.0:0 LISTENING 3824UDP 0.0.0.0:2049 *:* 38…

Linux文件系統與目錄結構

Linux系統中一切皆文件 bin 是Binary 的縮寫, 這個目錄存放著最經常使用的命令 boot 這里存放的是啟動Linux時使用的一些核心文件,包括一些連接文件以及鏡像文件,自 己的安裝別放這里。 cdrom 這個目錄通常專門用來掛載光盤。當系統剛安裝時&#x…

一文詳解基于NarrotoAI的短劇短視頻自動解說、混剪AI平臺搭建

背景 前陣給孩子做電子相冊學了點剪輯技術,就想湊個熱鬧剪剪短劇玩玩,一是學以 致用,再者也好奇短劇創作為啥這么火,跟個風。 初步了解情況后,發現我的剪輯技術已經落后了,行家們玩的主要是解說 &#xf…

計算機畢業設計Hadoop+Spark+DeepSeek-R1大模型音樂推薦系統 音樂數據分析 音樂可視化 音樂爬蟲 知識圖譜 大數據畢業設計

溫馨提示:文末有 CSDN 平臺官方提供的學長聯系方式的名片! 溫馨提示:文末有 CSDN 平臺官方提供的學長聯系方式的名片! 溫馨提示:文末有 CSDN 平臺官方提供的學長聯系方式的名片! 作者簡介:Java領…

《Canvas修仙傳·第三重天金丹境(下集)》 ——量子煙花與物理宇宙的混沌法則

各位道友久候!上集我們煉就了《靈蛇奇譚》的元神,今日將開啟Canvas修仙路上最絢麗的篇章——掌控微觀粒子的創世之力!(ノ≧?≦)ノ 章前黑話詞典 🔍 量子境術語表: 對象池(Object Po…

c++ namespace名字域空間

在C中,namespace 是一個非常重要的概念,用于組織代碼,避免名稱沖突。namespace(命名空間)是一個邏輯上的代碼組織單元,用于將代碼(類、函數、變量等)分組,從而避免命名沖…

獲取阿里云OSS預簽名URL下載(java)

1,引入依賴 <dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId> </dependency> <!--AliSms--> <dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-s…

中間件專欄之Redis篇——Redis的基本IO網絡模型

Redis主要采用的是單線程的事件驅動模型&#xff0c;通過I/O多路復用來實現高效的并發請求處理。 一、單線程模型 Redis 采用 單線程模型 來處理所有請求&#xff0c;包括網絡 I/O 和命令執行。雖然現代多核 CPU 能夠并行處理任務&#xff0c;但 Redis 的設計原則是盡量避免多…

Python 線程同步

Python 線程同步 Python 線程同步 Python 線程同步 線程同步是一種確保兩個或多個線程不同時執行同一塊共享代碼的機制。共享塊中的代碼通常是訪問共享數據或資源&#xff0c;這種共享塊被稱作臨界區。這個概念可以用下面的圖清晰地表示出來&#xff1a; #mermaid-svg-2TivIuc…

Linux操作系統5-進程信號3(信號的捕捉流程,信號集,sigaction)

上篇文章&#xff1a;Linux操作系統5-進程信號3&#xff08;信號的保存, 用戶態與內核態&#xff0c;內核空間&#xff09;-CSDN博客 本篇Gitee倉庫&#xff1a;???????myLerningCode/l26 橘子真甜/Linux操作系統與網絡編程學習 - 碼云 - 開源中國 (gitee.com) 本篇重點…

【機器學習chp10】降維——(核化)PCA + MDS + lsomap + 拉普拉斯特征映射 + t-NSE + UMAP

目錄 一、降維的意義與本質 1、意義 2、本質 3、常見降維方法 &#xff08;1&#xff09;線性降維 &#xff08;2&#xff09;非線性降維 二、基于重構的降維 1、PCA 2、核化PCA &#xff08;1&#xff09;實現過程 步驟一&#xff1a;數據映射與核函數定義 步驟二…

代碼的解讀——自用

代碼來自&#xff1a;https://github.com/ChuHan89/WSSS-Tissue?tabreadme-ov-file 借助了一些人工智能 run_pipeline.sh 功能總結 該腳本用于執行一個 弱監督語義分割&#xff08;WSSS&#xff09; 的完整流程&#xff0c;包含三個階段&#xff1a; Stage1&#xff1a;訓…

Powershell和BTEQ工具實現帶多組參數和標簽的Teradata數據庫批量數據導出程序

設計一個基于多個帶標簽SQL模板作為配置文件和多組參數的Powershell代碼程序和BTEQ工具&#xff0c;實現根據不同的輸入參數&#xff0c;自動批量地將Teradata數據庫的數據導出為CSV文件到指定目錄上&#xff0c;標簽和多個參數&#xff08;以“_”分割&#xff09;為組成導出數…

CF 118A.String Task(Java實現)

題目分析 輸入一個字符串&#xff0c;遍歷每一個字符&#xff0c;如果是元音字母就刪除&#xff0c;輔音字母就在其前面增加一個.&#xff0c;且所有字母輸出都是小寫。 思路分析 將輸入的字符串改為字符數組&#xff0c;考慮到任意位置插入的情況&#xff0c;所以主要選擇Lin…