【集合框架List接口】

👉 用 ArrayList 存數據,結果插入時卡住了?
👉 想刪除某個元素,卻發現索引錯亂了?
👉 不知道該用 ArrayList 還是 LinkedList,選錯了導致性能瓶頸?


一、List?是什么?—— 有序可重復的“列表”

🎯 核心特點

  • 有序(Ordered):元素按插入順序排列
  • 允許重復:可以存儲多個相同的值
  • 支持索引訪問:可以通過?get(index)?快速定位元素

? 典型場景

  • 用戶列表展示
  • 購物車商品管理
  • 日志記錄

🖼? 圖示:List?的邏輯結構

+--------+    +--------+    +--------+
| index0 | -> | index1 | -> | index2 | -> ...
+--------+    +--------+    +--------+
| valueA |    | valueB |    | valueC |
+--------+    +--------+    +--------+

? 核心操作

  • 添加元素:add(E e)
  • 獲取元素:get(int index)
  • 刪除元素:remove(int index)

二、List?的核心實現類

1.?ArrayList?—— 基于“動態數組”的實現

🎯 核心特性
  • 底層是數組Object[] elementData
  • 支持快速隨機訪問:通過索引直接定位,時間復雜度?O(1)
  • 動態擴容:當容量不夠時,自動擴展(默認擴容 1.5 倍)
  • 非線程安全
List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
String first = list.get(0); // 快速獲取第一個元素
🔍 動態擴容機制
private void grow(int minCapacity) {int oldCapacity = elementData.length;// 新容量 = 舊容量 + 舊容量/2 (即 1.5 倍)int newCapacity = oldCapacity + (oldCapacity >> 1);// 創建新數組,復制數據elementData = Arrays.copyOf(elementData, newCapacity);
}

內存變化

擴容前:[Apple][Banana]  (容量=2, size=2)
擴容后:[Apple][Banana][ ] (容量=3, size=2)

? 建議:初始化時指定合理容量,避免頻繁擴容影響性能。

? 經典誤區:中間插入/刪除慢
// 錯誤:頻繁在中間插入/刪除,導致后面元素移動,性能 O(n)
list.add(1, "Orange"); // 插入到索引 1
list.remove(1);        // 刪除索引 1

? 結論ArrayList 適合查詢多、增刪少的場景。


2.?LinkedList?—— 基于“雙向鏈表”的實現

🎯 核心特性
  • 底層是雙向鏈表:每個節點包含前后指針
  • 頭尾增刪快:時間復雜度?O(1)
  • 支持棧/隊列操作:實現了?Deque?接口
  • 非線程安全
LinkedList<String> list = new LinkedList<>();
list.addFirst("Apple"); // 頭插
list.addLast("Banana"); // 尾插
String first = list.getFirst(); // 快速獲取第一個元素
🖼? 圖示:雙向鏈表的內存布局
地址 2000: +--------+--------+--------+|prev=null| data=A |next=3000|+--------+--------+--------+地址 3000: +--------+--------+--------+|prev=2000| data=B |next=null|+--------+--------+--------+

邏輯結構

head                                   tail|                                      |v                                      v
+--------+    +--------+
|null|A|<--->|A|B|null|
+--------+    +--------+2000          3000

? 適用場景:頻繁在頭部或尾部增刪元素,如消息隊列、棧操作。

? 經典誤區:隨機訪問慢
// 錯誤:頻繁隨機訪問,導致遍歷整個鏈表,性能 O(n)
String third = list.get(2); // 需要遍歷兩次才能找到第三個元素

? 結論LinkedList 適合頭尾操作多、隨機訪問少的場景。


三、List?的常用方法詳解

1. 添加元素

// 在末尾添加
list.add("Apple");// 在指定位置插入
list.add(1, "Banana"); // 插入到索引 1

2. 獲取元素

// 通過索引獲取
String first = list.get(0);// 獲取第一個/最后一個元素
String first = list.get(0);
String last = list.get(list.size() - 1);

3. 刪除元素

// 刪除指定位置的元素
list.remove(1); // 刪除索引 1 的元素// 刪除指定對象(第一次出現)
list.remove("Apple");

4. 替換元素

// 替換指定位置的元素
list.set(1, "Grape"); // 將索引 1 的元素替換為 Grape

5. 查找元素

// 判斷是否包含某個元素
boolean contains = list.contains("Apple");// 查找元素的位置
int index = list.indexOf("Apple"); // 返回第一個 Apple 的索引
int lastIndex = list.lastIndexOf("Apple"); // 返回最后一個 Apple 的索引

6. 子列表操作

// 獲取子列表
List<String> subList = list.subList(1, 3); // 包含索引 1 和 2 的元素

四、List?的線程安全版本

1.?Collections.synchronizedList()?—— 簡單粗暴的同步

List<String> syncList = Collections.synchronizedList(new ArrayList<>());synchronized (syncList) {syncList.add("Apple");
}

? 缺點

  • 整個?List?對象加鎖,粒度過大,性能差。
  • 不支持并發讀寫,可能導致阻塞。

2.?CopyOnWriteArrayList?—— 寫時復制的線程安全?List

🎯 核心特性
  • 寫時復制:每次修改(add,?remove)都會創建一個新數組副本。
  • 適用于讀多寫少的場景:讀操作無鎖,寫操作加鎖但不影響讀。
List<String> cowList = new CopyOnWriteArrayList<>();
cowList.add("Apple");
cowList.add("Banana");

? 適用場景

  • 并發讀多、寫少的場景,如日志記錄、事件監聽器等。

五、高頻問題 & 高分回答

Q1:?ArrayList?和?LinkedList?如何選擇?

  • ArrayList:基于數組,查詢快O(1)),增刪慢O(n));
    適合隨機訪問多、增刪少的場景。
  • LinkedList:基于鏈表,增刪快O(1)?頭尾),查詢慢O(n));
    適合頻繁頭尾增刪的場景,或實現棧/隊列。
    我們項目中用戶列表用?ArrayList,消息隊列用?LinkedList

Q2:?ArrayList?的擴容機制是怎樣的?

  • 默認容量 10;
  • 擴容時,新容量 = 原容量 × 1.5;
  • 使用?Arrays.copyOf()?復制數據;
  • 擴容是耗時操作,建議初始化時指定合理容量

Q3:?LinkedList?的優勢和劣勢是什么?

  • 優勢:頭尾增刪快(O(1)),支持棧/隊列操作;
  • 劣勢:隨機訪問慢(O(n)),內存開銷稍大(每個節點有前后指針)。
    適合頻繁頭尾操作的場景,如消息隊列、棧操作。

Q4:?CopyOnWriteArrayList?的工作原理?

  • 寫時復制:每次修改(add,?remove)都會創建一個新數組副本;
  • 讀操作無鎖,寫操作加鎖但不影響讀;
  • 適用于讀多寫少的場景,如日志記錄、事件監聽器等。

六、總結:一張表搞懂?List?的選型

場景推薦實現關鍵點
隨機訪問多、增刪少ArrayList查詢快,擴容注意
頭尾增刪多、隨機訪問少LinkedList頭尾操作極快,隨機訪問慢
并發讀多寫少CopyOnWriteArrayList寫時復制,讀無鎖

🔚 最后一句話

List 是 Java 集合框架中最基礎、最常用的接口之一
它不僅僅是一個“容器”,更是我們日常開發中處理有序數據的核心工具。
只有當你真正理解了 ArrayList 的擴容機制、LinkedList 的雙向鏈表結構,
以及 CopyOnWriteArrayList 的寫時復制原理,
你才能寫出高效、健壯、專業的 Java 代碼!

希望這篇能幫你徹底搞懂 List 接口及其常見實現!

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

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

相關文章

《棒球百科》奧運會取消了棒球·野球1號位

?? 奧運會棒球消失&復活之謎&#xff01;深度揭秘全球體育權力游戲 ??? 2008年為何被踢出奧運&#xff1f;(Why Removed in 2008?)MLB的致命抵制? 奧運賽期撞車MLB常規賽白熱化階段&#xff01;? 球隊老板拒放巨星&#xff1a;2000年悉尼奧運美國隊僅剩"替補陣…

基于js和html的點名應用

分享一個在課堂或者是公司團建上需要點名的應用程序&#xff0c;開箱即用。1、雙擊打開后先選擇人員名單&#xff08;可以隨時更改的&#xff09;2、下面的滾動速度可以根據需求調整<!DOCTYPE html> <html lang"zh"> <head> <meta charset"…

【深度學習-基礎知識】單機多卡和多機多卡訓練

1. 單機多卡訓練&#xff08;Single Machine, Multi-GPU&#xff09; 概念 在同一臺服務器上&#xff0c;有多塊 GPU。一個訓練任務利用所有 GPU 并行加速訓練。數據集存放在本地硬盤或共享存儲上。 核心原理數據并行&#xff08;Data Parallelism&#xff09; 將一個 batch 劃…

數據庫原理及應用_數據庫基礎_第2章關系數據庫標準語言SQL_SQL語言介紹數據庫的定義和刪除

前言 "<數據庫原理及應用>(MySQL版)".以下稱為"本書"中2.1節和2.2節第一部分內容 引入 本書P40:SQL(Structure Query Language結構化查詢語言)是一種在關系數據庫中定義和操縱數據的標準語言,是用戶和數據庫之間進行交流的接口. ---SQL是一種語言,是…

實變函數中集合E的邊界與其補集的邊界是否相等

在實變函數&#xff08;或一般拓撲學&#xff09;中&#xff0c;給定一個集合 E \subseteq \mathbb{R}^n &#xff08;或更一般的拓撲空間&#xff09;&#xff0c;集合 E 的邊界&#xff08;boundary&#xff09;與 E 的補集 E^c 的邊界是否相等&#xff1f; 即&#x…

# C++ 中的 `string_view` 和 `span`:現代安全視圖指南

C 中的 string_view 和 span&#xff1a;現代安全視圖指南 文章目錄C 中的 string_view 和 span&#xff1a;現代安全視圖指南目錄1. 原始指針的痛點1.1 安全問題1.2 所有權不明確1.3 接口笨拙1.4 生命周期問題2. string_view 深入解析2.1 基本特性2.2 高效解析示例2.3 防止常見…

Linux學習-多任務(線程)

定義輕量級進程&#xff0c;實現多任務并發&#xff0c;是操作系統任務調度最小單位&#xff08;進程是資源分配最小單位 &#xff09;。創建由進程創建&#xff0c;屬于進程內執行單元。- 獨立&#xff1a;線程有8M 獨立棧區 。 - 共享&#xff1a;與所屬進程及進程內其他線程…

高級堆結構

一、二項堆&#xff08;Binomial Heap&#xff09;&#xff1a;理解「合并操作」的優化二項堆的核心優勢是高效合并&#xff0c;類似 “二進制加法”。我們通過「合并兩個二項堆」的偽代碼和步驟來理解&#xff1a;核心結構偽代碼&#xff1a;class BinomialTreeNode:def __ini…

系統學習算法 專題十七 棧

題目一&#xff1a;算法思路&#xff1a;一開始還是暴力解法&#xff0c;即遍歷字符串&#xff0c;如果出現當前位置的字符等于后面的字符&#xff0c;則刪除這兩個字符&#xff0c;然后再從頭遍歷&#xff0c;如此循環即可但是這樣時間復雜度很高&#xff0c;每刪除一次就從頭…

深入解析函數指針及其數組、typedef關鍵字應用技巧

目錄 一、函數指針變量的創建 1、什么是函數指針變量&#xff1f; 2、函數是否有地址&#xff1f; 3、創建函數指針變量 4、函數指針類型解析 二、函數指針變量的使用 三、兩段有趣的代碼 1、解釋 (*(void (*)())0)(); 2、解釋 void (*signal(int, void(*)(int)))(int…

k8s集群搭建一主多從的jenkins集群

方案 --------------------- | Jenkins Master | | - 持久化配置 |<---(hostpath 存儲) | - 自動容災 | --------------------|| Jenkins JNLP 通信| ----------v---------- ------------------- | Jenkins Agent | | Kubernetes Pl…

重溫k8s基礎概念知識系列三(工作負載)

文章目錄1、工作負載簡述2、Deployment1.1、創建 Deployment1.2、檢查 Deployment上線狀態3、StatefulSet4、DaemonSet3.1、創建 DaemonSet3.2、運行DaemonSet5、Job5.1、運行示例 Job5.2、檢查 Job 的狀態6、CronJob上一節&#xff0c;我們復習了Pod相關知識&#xff0c;大多情…

開源 Arkts 鴻蒙應用 開發(十八)通訊--Ble低功耗藍牙服務器

文章的目的為了記錄使用Arkts 進行Harmony app 開發學習的經歷。本職為嵌入式軟件開發&#xff0c;公司安排開發app&#xff0c;臨時學習&#xff0c;完成app的開發。開發流程和要點有些記憶模糊&#xff0c;趕緊記錄&#xff0c;防止忘記。 相關鏈接&#xff1a; 開源 Arkts …

Go語言并發編程 ------ 鎖機制詳解

Go語言提供了豐富的同步原語來處理并發編程中的共享資源訪問問題。其中最基礎也最常用的就是互斥鎖&#xff08;Mutex&#xff09;和讀寫鎖&#xff08;RWMutex&#xff09;。1. sync.Mutex&#xff08;互斥鎖&#xff09;Mutex核心特性互斥性/排他性&#xff1a;同一時刻只有一…

8月17日星期天今日早報簡報微語報早讀

8月17日星期天&#xff0c;農歷閏六月廿四&#xff0c;早報#微語早讀。1、《南京照相館》領跑&#xff0c;2025年暑期檔電影總票房破95億&#xff1b;2、神舟二十號圓滿完成第三次出艙任務&#xff1b;3、宇樹G1人形機器人100米障礙賽再奪金牌&#xff1b;4、廣東佛山新增報告基…

在QML中使用Chart組件

目錄前言1. 如何安裝 Chart 組件2. 創建 QML 工程時的常見問題3. 解決方案&#xff1a;改用 QApplication QQuickView修改主函數&#xff08;main.cpp&#xff09;4. QApplication 與 QGuiApplication 的差異為什么 Qt Charts 需要 QApplication&#xff1f;總結示例下載前言 …

【P40 6-3】OpenCV Python——圖像融合(兩張相同屬性的圖片按比例疊加),addWeighted()

P40 6-3 文章目錄import cv2 import numpy as npback cv2.imread(./back.jpeg) smallcat cv2.imread(./smallcat1.jpeg)#只有兩張圖的屬性是一樣的才可以進行溶合 print(back.shape) print(smallcat.shape)result cv2.addWeighted(smallcat, 0.7, back, 0.3, 0) cv2.imshow(…

傳輸層協議 TCP(1)

傳輸層協議 TCP&#xff08;1&#xff09; TCP 協議 TCP 全稱為 “傳輸控制協議(Transmission Control Protocol”). 人如其名, 要對數據的傳輸進行一個詳細的控制; TCP 協議段格式 ? 源/目的端口號: 表示數據是從哪個進程來, 到哪個進程去; ? 32 位序號/32 位確認號: 后面詳…

黎陽之光:以動態感知與 AI 深度賦能,引領電力智慧化轉型新革命

當全球能源結構加速向清潔低碳轉型&#xff0c;新型電力系統建設成為國家戰略核心&#xff0c;電力行業正經歷從傳統運維向智慧化管理的深刻變革。2024 年《加快構建新型電力系統行動方案》明確提出&#xff0c;到 2027 年需建成全國智慧調度體系&#xff0c;實現新能源消納率突…

自動駕駛中的傳感器技術34——Lidar(9)

補盲lidar設計&#xff1a;機械式和半固態這里不再討論&#xff0c;這里主要針對全固態補盲Lidar進行討論1、系統架構設計采用Flash方案&#xff0c; 設計目標10m10%&#xff0c;實現30m距離的點云覆蓋&#xff0c;同時可以驗證不同FOV鏡頭的設計下&#xff0c;組合為多款產品。…