【 java 集合知識 第一篇 】

1.概念

1.1.集合與數組的區別

集合:長度不固定,動態的根據數據添加刪除改變長度,并且只能存入引用類型,讀取采用迭代器或其他方法

數組:長度固定,不可改變,既可以存入基本類型也可以存入引用類型,讀取使用索引讀(for)

長度存入類型讀取
集合長度不固定,動態的根據數據添加刪除改變長度只能存入引用類型采用迭代器或其他方法
數組長度固定,不可改變既可以存入基本類型也可以存入引用類型使用索引(for)

1.2.集合分類

分為三類:List類,Set類,Map類

List集合:集合里面元素有序,并且允許可重復

Set集合:集合里面元素無序,并且不可重復(保證唯一性)

Map集合:集合采用鍵值對方式,key唯一(不允許重復)無序,value沒有要求

是否有序是否可重復
List有序可重復
Set無序不可重復

1.3.Collection和Collections的區別

Collection是一個接口,給集合實現的,里面定義了一些操作集合的方法

Collections是一個工具類,位于java.util包中,可以直接使用該類操作集合(增刪改,排序)

1.4.集合遍歷的方法

有六種方法:for,增強for,迭代器,列表迭代器,foeEach,Stream流

for:帶索引查詢(區分集合是否帶索引,才能使用該方法)

List<String> list = Arrays.asList("A", "B", "C");// 通過索引遍歷(適合 ArrayList 等支持隨機訪問的集合)
for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));
}

增強for:沒有索引,直接遍歷查詢

List<String> list = Arrays.asList("A", "B", "C");// 直接遍歷元素(底層基于迭代器實現)
for (String item : list) {System.out.println(item);
}

迭代器:在迭代器里面只能刪除元素,不能插入元素

List<String> list = Arrays.asList("A", "B", "C");
Iterator<String> iterator = list.iterator();// 通過迭代器遍歷(適用于所有 Collection)
while (iterator.hasNext()) {String item = iterator.next();System.out.println(item);// 可在遍歷中安全刪除元素:iterator.remove();
}
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
Iterator<String> iterator = list.iterator();while (iterator.hasNext()) {String item = iterator.next();if ("B".equals(item)) {iterator.remove(); // 允許刪除當前元素// iterator.add("D"); // 編譯錯誤:Iterator 沒有 add() 方法}
}

列表迭代器:沒有限制,可以進行刪除查詢插入元素

List<String> list = Arrays.asList("A", "B", "C");
ListIterator<String> listIterator = list.listIterator();// 正向遍歷(從頭到尾)
while (listIterator.hasNext()) {String item = listIterator.next();System.out.println(item);
}// 反向遍歷(從尾到頭)
while (listIterator.hasPrevious()) {String item = listIterator.previous();System.out.println(item);
}
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
ListIterator<String> listIterator = list.listIterator();// 正向遍歷
while (listIterator.hasNext()) {String item = listIterator.next();if ("B".equals(item)) {listIterator.remove();  // 刪除當前元素listIterator.add("D");  // 在當前位置插入新元素listIterator.set("E");  // 替換當前元素(需在 next() 或 previous() 后調用)}
}// 反向遍歷
while (listIterator.hasPrevious()) {String item = listIterator.previous();System.out.println(item);
}

forEach:因為它基于迭代器實現的,因此也不能在循環中插入元素

List<String> list = Arrays.asList("A", "B", "C");// 使用 Lambda 表達式遍歷
list.forEach(item -> System.out.println(item));// 或使用方法引用
list.forEach(System.out::println);

Stream:沒有限制

List<String> list = Arrays.asList("A", "B", "C");// 轉換為 Stream 并遍歷
list.stream().forEach(item -> System.out.println(item));// 并行流遍歷(多線程處理)
list.parallelStream().forEach(item -> System.out.println(item));

2.List

2.1.List的實現

實現List的集合有:ArrayList,LinkedList,Vector

ArrayList:基于動態的數組創建的,查詢效率高,增刪效率一般,線程不安全

LinkedList:基于雙向鏈表創建的,查詢效率一般,增刪效率高,線程不安全

Vector:基于動態數組創建的,與ArrayList類似,不過它是線程安全的

數據結構讀操作寫操作線程安全
ArrayList數組一般不安全
LinkedList雙向鏈表一般不安全
Vector數組一般安全

2.2.可以一邊遍歷一邊修改List的方法

首先思考有幾個遍歷方法:六個

哪些是不能修改元素的:迭代器,forEach

最終得到的方法:for,增強for,列表迭代器,Stream流

2.3.List快速刪除元素的原理

原理是基于集合底層數據結構不同,分為兩類:ArrayList,LinkedList

ArrayList:基于數組對吧,原先數組是通過索引刪除數據,那么因此ArrayList也是如此,基于索引來刪除數據

具體實現:如果你是刪除尾部最后一個數據,直接刪除即可,時間復雜度為O(1),如果不是,那么它會將索引元素刪除后,將后面的元素往前面覆蓋,然后計算出集合長度,時間復雜度為O(n),n為元素的個數

LinkedList:基于雙向鏈表,簡單來說鏈表由節點組成,每個節點包含自己的數據與前一個節點的引用和后一個節點的引用,實現雙向并通

具體實現:如果你是刪除尾部最后一個數據,直接刪除即可,時間復雜度為O(1),如果不是,那么就是從頭或尾進行查詢刪除,時間復雜度O(n)

2.4.ArrayList與LinkedList的區別

  • 數據結構組成不同:Array List基于數組,LinkedList基于雙向鏈表
  • 刪除和插入效率不同:ArrayList在尾部的效率高(平均O(1)),在其他的地方效率低,由于需要進行元素覆蓋,而LinkedList它基于鏈表引用,在尾部的效率(O(1)比ArrayList效率低(ArrayList基于數組,內存是連續的,而LinkedList基于鏈表,內存不連續),在其他地方刪除與插入與ArrayList效率差不多(O(n))
  • 隨機訪問速度:由于ArrayList基于數組根據索引查詢,時間復雜度O(1),而LinkedList基于鏈表,它需要從頭或尾部訪問,因此時間復雜度為O(n)
  • 適用場景不同:ArrayList更適合高頻的隨機訪問操作或尾部插入為主,LinkedList更適合高頻頭尾插入/刪除(隊列)或需要雙向遍歷
  • 線程安全:都是線程不安全的

2.5.線程安全

實現線程(List)安全的方法有:

  • 實現Collections.synchronizedList,將線程不安全的List集合加個鎖,變成安全的
  • 直接使用線程安全的List集合:比如Vector,CopyOnWirteArrayList

2.6.ArrayList的擴容機制

首先如果你沒有指定長度,默認長度為10,當你要添加元素并且超過此時容量長度時,就會進行擴容操作

實現:

1.擴容:創建一個新的數組,新數組的長度為原數組的1.5倍數,然后再檢查容量是否足夠,不夠繼續擴容

---

2.復制:將舊的數組里面的值復制進新的數組中,再進行寫操作

---

3.更改引用:將原先指向舊數組的引用指向新數組

---

4.擴容完成:可以繼續擴容

2.7.CopyOnWirteArrayList

它實現了讀寫分離,寫操作加了互斥鎖ReentrantLock,避免出現線程安全問題,而讀操作沒有加鎖,使用volatile關鍵字修飾數組,保證當前線程對數組對象重新賦值后,其他線程可以及時感知到(所有線程可見性)。線程讀取數據可以直接讀取,提高效率

寫操作:它不會向ArrayList一樣直接擴容1.5倍,它是根據你的添加元素個數多少來擴容,如果你只添加一個元素,那么它會創建一個新數組,長度比舊數組長度多一,然后依舊是依次復制元素進新數組中,改變內部引用指向(需要頻繁創建新的數組,以時間換空間)

讀操作:就是說它不會管你的數據是否修改,內部指向是舊數組,那么就讀取舊數組的數據,指向是新數組就讀取新數據,這樣效率會高(數據弱一致性)

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

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

相關文章

嵌入式開發學習日志(linux系統編程--系統編程之 進程間通信IPC)Day32

一、引言 空間獨立&#xff0c;需要一些操作&#xff1b; 分為三大類&#xff1a; 1、古老的通信方式 無名管道 有名管道 信號 2、IPC對象通信 system v BSD suse fedora kernel.org 消息隊列(用的相對少&#xff0c;這里不討論) …

metersphere不同域名的參數在鏈路測試中如何傳遞?

域名1&#xff1a;https://api.domain1.com 域名2&#xff1a;https://api.domain2.com 域名1的返回參數stteid會作為域名2的入參 步驟&#xff1a; 1&#xff09;先在metersphere—接口測試—接口定義中創建域名1和域名2的接口 2&#xff09;接口創建好后&#xff0c;在接口測…

使用Process Explorer、System Informer(Process Hacker)和Windbg工具排查軟件高CPU占用問題

目錄 1、問題現象 2、使用Process Explorer和System Informer&#xff08;該工具原先叫Process Hacker&#xff09;查看占用CPU高的線程 3、使用System Informer工具時發現了一個關鍵細節 4、將Windbg附加到軟件進程上&#xff0c;根據System Informer中顯示的線程id到Wind…

Linux(線程概念)

目錄 一 虛擬地址到物理地址的轉換 1. 操作系統如何管理物理內存&#xff1a; 2. 下面來談談虛擬地址如何轉換到物理地址&#xff1a; 3. 補充字段&#xff1a; 二 Linux中的線程 1. 先來說說進程&#xff1a; 2. 線程&#xff1a; 3. 線程相比較于進程的優缺點&#x…

阿里云為何,一個郵箱綁定了兩個賬號

阿里云“幽靈賬號”之謎&#xff1a;同一個郵箱注銷后仍有兩個賬號&#xff1f;深度揭秘成因與終極解決方案&#xff01; 你是否曾在阿里云上使用同一個郵箱注冊過多個賬號&#xff0c;明明已經**“徹底”注銷了其中一個**&#xff0c;卻驚愕地發現系統里依然**“幽靈般”掛著…

動態規劃-數位DP

今天開始做關于數位DP的問題&#xff0c;首先對于數位DP來說&#xff0c;這類問題難度較大&#xff0c;比較難理解&#xff0c;所以博主也會盡量講的更加詳細一些&#xff0c;來幫助大家更好地理解這里的相關知識。 前置知識&#xff1a; 1.首先對于數位DP來說&#xff0c;主…

總覽四級考試

別被“四級”這個龐然大物嚇到&#xff01;我們一起拆解它&#xff1a;?? &#x1f4cd; ??核心認知&#xff1a;四級是一場策略性考試&#xff01;?? 它不考智商&#xff0c;考的是??基礎英語能力 考試技巧 時間管理??。基礎可以通過努力補&#xff0c;技巧可以…

BSRR對比BRR對比ODR

? 三種操作方式的本質區別 寄存器功能原子操作特點BSRR同時支持置位(1)和復位(0)?? 是單指令完成任意位操作&#xff0c;無競爭風險ODR直接讀寫輸出狀態? 否需"讀-改-寫"&#xff0c;多線程/中斷中需關中斷保護BRR只能復位(0)?? 是僅清零功能&#xff0c;無置…

職坐標精選嵌入式AI物聯網開源項目

隨著嵌入式、AI與物聯網技術的深度融合&#xff0c;開源生態已成為開發者構建智能硬件解決方案的核心驅動力。本文將從嵌入式實時操作系統、多模態AI數據集及物聯網接入平臺三大維度切入&#xff0c;系統性梳理技術選型要點與實踐路徑。在嵌入式領域&#xff0c;重點解析低功耗…

Ubuntu系統 | 本地部署ollama+deepseek

1、Ollama介紹 Ollama是由Llama開發團隊推出的開源項目,旨在為用戶提供高效、靈活的本地化大型語言模型(LLM)運行環境。作為Llama系列模型的重要配套工具,Ollama解決了傳統云服務對計算資源和網絡連接的依賴問題,讓用戶能夠在個人電腦或私有服務器上部署和運行如Llama 3等…

【數據庫】關系數據庫標準語言-SQL(金倉)下

4、數據查詢 語法&#xff1a; SELECT [ALL | DISTINCT] <目標列表達式> [,<目標列表達式>] … FROM <表名或視圖名>[, <表名或視圖名> ] … [ WHERE <條件表達式> ] [ GROUP BY <列名1> [ HAVING <條件表達式> ] ] [ ORDER BY <…

基于YOLO-NAS-Pose的無人機象群姿態估計:群體行為分析的突破

【導讀】 應對氣候變化對非洲象的生存威脅&#xff0c;本研究創新采用無人機航拍結合AI姿態分析技術&#xff0c;突破傳統觀測局限。團隊在肯尼亞桑布魯保護區對比測試DeepLabCut與YOLO-NAS-Pose兩種模型&#xff0c;首次將后者引入野生動物研究。通過檢測象群頭部、脊柱等關鍵…

8.RV1126-OPENCV 視頻中添加LOGO

一.視頻中添加 LOGO 圖像大體流程 首先初始化VI,VENC模塊并使能&#xff0c;然后創建兩個線程&#xff1a;1.把LOGO灰度化&#xff0c;然后獲取VI原始數據&#xff0c;其次把VI數據Mat化并創建一個感興趣區域&#xff0c;最后把LOGO放感興趣區域里并把數據發送給VENC。2.專門獲…

AI+3D 視覺重塑塑料袋拆垛新范式:遷移科技解鎖工業自動化新高度

在工業自動化浪潮席卷全球的當下&#xff0c;倉儲物流環節的效率與精準度成為企業降本增效的關鍵戰場。其中&#xff0c;塑料袋拆垛作為高頻、高重復性的作業場景&#xff0c;傳統人工或機械臂操作面臨著諸多挑戰。遷移科技&#xff0c;作為行業領先的 3D 工業相機和 3D 視覺系…

MATLAB實戰:視覺伺服控制實現方案

以下是一個基于MATLAB的視覺伺服控制項目實現方案&#xff0c;結合實時圖像處理、目標跟蹤和控制系統設計。我們將使用模擬環境進行演示&#xff0c;但代碼結構可直接應用于真實硬件。 系統架構 圖像采集 → 目標檢測 → 誤差計算 → PID控制器 → 執行器控制 完整代碼實現 …

RequestRateLimiterGatewayFilterFactory

一、功能說明 RequestRateLimiterGatewayFilterFactory 是 Spring Cloud Gateway 的流量控制組件&#xff0c;用于實現 API 請求速率限制&#xff0c;核心功能包括&#xff1a; 限制單位時間內的請求數量&#xff08;如每秒10次&#xff09;防止服務被突發流量擊垮&#xff0…

鴻蒙倉頡語言開發實戰教程:購物車頁面

大家上午好&#xff0c;倉頡語言商城應用的開發進程已經過半&#xff0c;不知道大家通過這一系列的教程對倉頡開發是否有了進一步的了解。今天要分享的購物車頁面&#xff1a; 看到這個頁面&#xff0c;我們首先要對它簡單的分析一下。這個頁面一共分為三部分&#xff0c;分別是…

AXURE安裝+漢化-Windows

安裝網站&#xff1a;https://www.axure.com/release-history/rp9 Axure中文漢化包下載地址 鏈接:https://pan.baidu.com/s/1U62Azk8lkRPBqWAcrJMFew?pwd5418 提取碼:5418 下載完成之后&#xff0c;crtlc lang文件夾 到下載的Axure路徑下 雙擊點進這個目錄里面。ctrlv把lan…

【Oracle】視圖

個人主頁&#xff1a;Guiat 歸屬專欄&#xff1a;Oracle 文章目錄 1. 視圖基礎概述1.1 視圖的概念與特點1.2 視圖的工作原理1.3 視圖的分類 2. 簡單視圖2.1 創建簡單視圖2.1.1 基本簡單視圖2.1.2 帶計算列的簡單視圖 2.2 簡單視圖的DML操作2.2.1 通過視圖進行INSERT操作2.2.2 通…

Lua和JS的垃圾回收機制

Lua 和 JavaScript 都采用了 自動垃圾回收機制&#xff08;GC&#xff09; 來管理內存&#xff0c;開發者無需手動釋放內存&#xff0c;但它們的 實現機制和行為策略不同。下面我們從原理、策略、優缺點等方面來詳細對比&#xff1a; &#x1f536; 1. 基本原理對比 特性LuaJa…