Java List 接口知識點詳解

一、List 接口概述

1. 基本定義

  • 繼承關系List?是 Java 集合框架(Collection Framework)中的一個有序隊列接口,直接繼承自?Collection?接口。
  • 核心特性
    • 有序性:元素按插入順序存儲,可通過索引(Index)訪問元素。
    • 可重復性:允許存儲重復元素。
    • 動態擴容:底層實現類(如?ArrayListLinkedList)支持動態調整容量。

2. 與其他接口的區別

接口有序性重復性數據結構典型實現類
List線性表ArrayListLinkedList
Set集合(哈希表等)HashSetTreeSet
Queue隊列(FIFO)LinkedListPriorityQueue

二、List 接口核心方法

1. 元素操作方法

(1)添加元素
  • boolean add(E e):向列表末尾添加元素,成功返回?true
List<String> list = new ArrayList<>();
list.add("Apple"); // 添加到末尾

void add(int index, E element):在指定索引處插入元素,后續元素后移。

list.add(1, "Banana"); // 在索引1處插入元素
(2)刪除元素
  • E remove(int index):移除指定索引處的元素,返回被刪除元素。
String removed = list.remove(0); // 移除索引0的元素

boolean remove(Object o):移除列表中第一個匹配的元素(通過?equals?方法判斷)。

list.remove("Apple"); // 移除值為"Apple"的元素
(3)修改元素
  • E set(int index, E element):用指定元素替換指定索引處的元素,返回舊元素。
String oldValue = list.set(0, "Grape"); // 將索引0的元素改為"Grape"
(4)查詢元素
  • E get(int index):返回指定索引處的元素。
String first = list.get(0); // 獲取索引0的元素

int indexOf(Object o):返回元素首次出現的索引,不存在則返回?-1

int pos = list.indexOf("Banana"); // 查詢"Banana"的位置
  • int lastIndexOf(Object o):返回元素最后一次出現的索引,不存在則返回?-1

2. 集合操作方法

  • boolean contains(Object o):判斷列表是否包含指定元素(基于?equals)。
  • boolean.addAll(Collection<? extends E> c):將其他集合的所有元素添加到列表末尾。
  • void clear():移除列表中的所有元素。
  • boolean isEmpty():判斷列表是否為空。
  • int size():返回列表中的元素個數。

3. 迭代與視圖方法

  • 迭代器(Iterator)
Iterator<String> it = list.iterator();
while (it.hasNext()) {String element = it.next();// 處理元素
}

列表迭代器(ListIterator):支持雙向遍歷和元素修改:

ListIterator<String> lit = list.listIterator();
while (lit.hasNext()) {String element = lit.next();lit.set(element + "_modified"); // 修改元素
}
  • 子列表(SubList):返回列表中指定范圍的視圖(List.subList(int fromIndex, int toIndex)):
List<String> sub = list.subList(0, 2); // 包含索引0,不包含索引2

三、List 接口的實現類

1. ArrayList

(1)特點
  • 底層結構:動態數組(Object[])。
  • 優缺點
    • ? 隨機訪問(get(int))速度快(時間復雜度 O (1))。
    • ? 插入 / 刪除元素時需移動后續元素,效率較低(時間復雜度 O (n))。
  • 適用場景:頻繁查詢、較少增刪的場景(如數據展示、日志記錄)。
(2)擴容機制
  • 初始容量默認值為?10(JDK 1.8)。
  • 當元素數量超過容量時,新容量為?原容量的 1.5 倍(通過?Arrays.copyOf?復制數組)。

2. LinkedList

(1)特點
  • 底層結構:雙向鏈表(每個節點包含?prevnext?指針)。
  • 優缺點
    • ? 插入 / 刪除元素時只需修改指針,效率高(時間復雜度 O (1),若已知節點位置)。
    • ? 隨機訪問需遍歷鏈表,效率低(時間復雜度 O (n))。
  • 適用場景:頻繁增刪的場景(如隊列、棧、緩存)。
(2)特殊方法
  • 可作為隊列(Queue)使用:
LinkedList<String> queue = new LinkedList<>();
queue.offer("A"); // 入隊(添加到末尾)
String first = queue.poll(); // 出隊(移除并返回頭部元素)

可作為棧(Stack)使用:

queue.push("B"); // 入棧(添加到頭部)
String last = queue.pop(); // 出棧(移除并返回頭部元素)

3. Vector(線程安全)

(1)特點
  • 底層結構:動態數組,與?ArrayList?類似。
  • 線程安全:方法通過?synchronized?修飾(如?add()get()),但性能較低。
  • 適用場景:多線程環境下需要線程安全的場景(較冷門,推薦使用?Collections.synchronizedList()?替代)。

4. 實現類對比表

實現類底層結構線程安全隨機訪問效率增刪效率(中間位置)默認初始容量
ArrayList動態數組高(O (1))低(O (n))10
LinkedList雙向鏈表低(O (n))高(O (1))-
Vector動態數組高(O (1))低(O (n))10

四、List 接口的常用操作場景

1. 遍歷列表的 4 種方式

(1)普通 for 循環(索引遍歷)
for (int i = 0; i < list.size(); i++) {String element = list.get(i);
}

適用場景:需要通過索引操作元素(如修改、刪除)。

(2)增強 for 循環(foreach)
for (String element : list) {// 只讀操作元素
}

注意:遍歷時若修改列表(如?list.remove()),會拋出?ConcurrentModificationException(fail-fast 機制)。

(3)Iterator 迭代器
Iterator<String> it = list.iterator();
while (it.hasNext()) {String element = it.next();if (element.equals("Apple")) {it.remove(); // 安全刪除元素的方式}
}

優勢:支持遍歷過程中安全刪除元素(通過?Iterator.remove())。

(4)Java 8 Stream 流式遍歷
list.stream().forEach(element -> {System.out.println(element);
});

適用場景:結合 Lambda 表達式實現復雜邏輯(如過濾、映射)。

2. 列表排序與搜索

(1)排序(Collections.sort()
List<Integer> nums = Arrays.asList(3, 1, 4, 2);
Collections.sort(nums); // 升序排列(默認自然排序)
// 自定義排序(降序)
Collections.sort(nums, (a, b) -> b - a);
(2)二分查找(Collections.binarySearch()
Collections.sort(nums); // 需先排序
int index = Collections.binarySearch(nums, 3); // 返回元素3的索引

3. 線程安全處理

  • 場景:多線程環境下操作?List?時,需保證線程安全。
  • 解決方案
    1. 使用?Vector(性能較低)。
    2. 通過?Collections.synchronizedList()?包裝普通?List
List<String> safeList = Collections.synchronizedList(new ArrayList<>());

使用并發包?java.util.concurrent?中的?CopyOnWriteArrayList(適用于讀多寫少場景):

List<String> concurrentList = new CopyOnWriteArrayList<>();

五、常見問題與最佳實踐

1. ArrayList vs LinkedList 如何選擇?

  • 優先選 ArrayList:需要頻繁隨機訪問(如查詢),或數據量已知、增刪操作少。
  • 優先選 LinkedList:需要頻繁在頭部 / 中間插入 / 刪除元素,或數據量不確定、需高效動態調整。

2. 列表擴容的性能影響

  • ArrayList?擴容時會創建新數組并復制舊元素,若初始容量預估不足,多次擴容會導致性能下降。
  • 最佳實踐:通過構造方法指定初始容量:
    List<String> list = new ArrayList<>(100); // 初始容量設為100,減少擴容次數

    3. 避免內存泄漏

  • 若存儲大量對象,需及時調用?clear()?或置為?null,幫助垃圾回收器回收內存。
  • 強制類型轉換風險:非泛型?List?會存儲?Object?類型,取出時需強制類型轉換,可能引發?ClassCastException
  • 最佳實踐:使用泛型限定元素類型:
List<String> list = new ArrayList<>(); // 限定只能存儲String類型

六、總結

特性List 接口特點
核心優勢有序性、可重復性、索引訪問,適用于需要按順序操作的數據場景。
實現類選擇- 高頻查詢:ArrayList
- 高頻增刪:LinkedList
- 線程安全:CopyOnWriteArrayList
常用操作添加 / 刪除元素、遍歷、排序、子列表操作、線程安全處理。

通過掌握?List?接口的核心方法與實現類特性,可在開發中高效處理線性數據集合,提升代碼的健壯性與性能。

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

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

相關文章

OpenCV-去噪效果和評估指標方法

實驗前言 噪音類型 opencv常見噪音類型有 高斯噪音&#xff1a;高斯噪音是一種隨機噪音&#xff0c;其數值服從正態分布。圖像受到高斯噪音的影響時&#xff0c;像素值的變化類似于白噪音&#xff0c;但是噪音的強度會隨像素值的變化而變化。 椒鹽噪音&#xff1a;椒鹽噪音是…

永磁同步電機公式總結【一】——反電動勢、磁鏈、轉矩公式;三項、兩項電壓方程;坐標表換方程

一、PMSM 電機參數介紹 1.1 轉子極數 轉子極數 (Rotor Poles) &#xff1a;三相交流電機每組線圈都會產生 N、S 磁極&#xff0c;每個電機每相含有的永磁體磁極個數就是極數。由于磁極是成對出現的&#xff0c;所以電機有 2、4、6、8……極 (偶數)。 未知參數的電機&#xff…

eMMC深度解析:嵌入式多媒體卡的硬件電路設計要點

一、eMMC 技術深度解析 1.定義與背景 eMMC&#xff08;Embedded Multi Media Card&#xff09;是一種專為嵌入式系統設計的非易失性存儲解決方案&#xff0c;它將 NAND 閃存、主控芯片和接口協議封裝在一個 BGA&#xff08;Ball Grid Array&#xff09;封裝中。其核心目標是簡…

常見提示詞攻擊方法和防御手段——提示詞越獄

提示詞越獄&#xff08;Prompt Jailbreaking&#xff09;是一種針對大型語言模型&#xff08;LLM&#xff09;的攻擊手段&#xff0c;旨在通過精心設計的輸入提示繞過模型的安全審查和倫理限制&#xff0c;使其生成原本被禁止的內容&#xff08;如暴力、非法操作、敏感信息等&a…

MySQL之基礎事務和隔離級別

目錄 引言&#xff1a; 什么是事務&#xff1f; 事務和鎖 mysql數據庫控制臺事務的幾個重要操作指令&#xff08;transaction.sql&#xff09; 1、事物操作示意圖&#xff1a; 2.事務的隔離級別 四種隔離級別&#xff1a; 總結一下隔離指令 1. 查看當前隔離級別?? …

學習記錄:DAY29

項目開發日志&#xff1a;技術實踐與成長之路 前言 回顧這幾天的狀態&#xff0c;熱情總是比我想象中更快被消耗完。比起茫然徘徊的小丑&#xff0c;我更希望自己是對著風車沖鋒的瘋子。 今天繼續深入項目的實際業務。 狀態好點的時候&#xff0c;再看自己EMO時寫的東西&…

kotlin Android AccessibilityService 無障礙入門

安卓的無障礙模式可以很好的進行自動化操作以幫助視障人士自動化完成一些任務。 無障礙可以做到&#xff0c;監聽屏幕變化&#xff0c;朗讀文本&#xff0c;定位以及操作控件等。 以下從配置到代碼依次進行無障礙設置與教程。 一、配置 AndroidManifest.xml 無障礙是個服務…

【Vue篇】數據秘語:從watch源碼看響應式宇宙的蝴蝶效應

目錄 引言 一、watch偵聽器&#xff08;監視器&#xff09; 1.作用&#xff1a; 2.語法&#xff1a; 3.偵聽器代碼準備 4. 配置項 5.總結 二、翻譯案例-代碼實現 1.需求 2.代碼實現 三、綜合案例——購物車案例 1. 需求 2. 代碼 引言 &#x1f4ac; 歡迎討論&#…

WPS中代碼段的識別方法及JS宏實現

在WPS中&#xff0c;文檔的基本結構可以通過對象模型來理解&#xff1a; &#xff08;1&#xff09;Document對象&#xff1a;表示整個文檔 &#xff08;2&#xff09;Range對象&#xff1a;表示文檔中的一段連續區域&#xff0c;可以是一個字符、一個句子或整個文檔 &#…

el-tree結合el-tree-transfer實現穿梭框里展示樹形數據

參考文章&#xff1a;我把他的彈框單拉出來一個獨立文件作為組件方便使用&#xff0c;遇到一些問題記錄一下。 testComponet.vue <template><div class"per_container"><div class"per_con_left"><div class"per_con_title&q…

Go 后端中雙 token 的實現模板

下面是一個典型的 Go 后端雙 Token 認證機制 實現模板&#xff0c;使用 Gin 框架 JWT Redis&#xff0c;結構清晰、可拓展&#xff0c;適合實戰開發。 項目結構建議 /utils├── jwt.go // Access & Refresh token 的生成和解析├── claims.go // 從請求…

Typescript學習教程,從入門到精通,TypeScript 對象語法知識點及案例代碼(7)

TypeScript 對象語法知識點及案例代碼 TypeScript 是 JavaScript 的超集&#xff0c;提供了靜態類型檢查和其他增強功能。在 TypeScript 中&#xff0c;對象是面向對象編程&#xff08;OOP&#xff09;的基礎。 一、對象概述 在 TypeScript 中&#xff0c;對象是屬性的集合&a…

應用BERT-GCN跨模態情緒分析:貿易緩和與金價波動的AI歸因

本文運用AI量化分析框架&#xff0c;結合市場情緒因子、宏觀經濟指標及技術面信號&#xff0c;對黃金與美元指數的聯動關系進行解析&#xff0c;揭示本輪貴金屬回調的深層驅動因素。 周三&#xff0c;現貨黃金價格單日跌幅達2.1%&#xff0c;盤中觸及3167.94美元/盎司關鍵價位&…

命令行登錄 MySQL 報 Segmentation fault 故障解決

問題描述&#xff1a;對 mysql8.0.35 源碼進行 make&#xff0c;由于一開始因為yum源問題少安裝依賴庫 庫&#xff0c;在鏈接時遇到錯誤 undefined reference to&#xff0c;后來安裝了相關依賴庫&#xff0c;再次 make 成功。于是將 mysqld 啟動&#xff0c;再用 mysql -u roo…

Axure設計數字鄉村可視化大屏:構建鄉村數據全景圖

今天&#xff0c;讓我們一同深入了解由Axure設計的數字鄉村可視化大屏&#xff0c;看看它如何通過精心的布局和多樣化的圖表類型&#xff0c;將鄉村的各類數據以直觀、易懂的方式呈現出來&#xff0c;為鄉村管理者提供有力的數據支持。 原型效果預覽鏈接&#xff1a;Axure數字鄉…

3D個人簡歷網站 4.小島

1.模型素材 在Sketchfab上下載狐貍島模型&#xff0c;然后轉換為素材資源asset&#xff0c;嫌麻煩直接在網盤鏈接下載素材&#xff0c; Fox’s islandshttps://sketchfab.com/3d-models/foxs-islands-163b68e09fcc47618450150be7785907https://gltf.pmnd.rs/ 素材夸克網盤&a…

智能開發工具PhpStorm v2025.1——增強AI輔助編碼功能

PhpStorm是一個輕量級且便捷的PHP IDE&#xff0c;其旨在提高用戶效率&#xff0c;可深刻理解用戶的編碼&#xff0c;提供智能代碼補全&#xff0c;快速導航以及即時錯誤檢查。可隨時幫助用戶對其編碼進行調整&#xff0c;運行單元測試或者提供可視化debug功能。 立即獲取PhpS…

Spark 的運行模式(--master) 和 部署方式(--deploy-mode)

Spark 的 運行模式&#xff08;--master&#xff09; 和 部署方式&#xff08;--deploy-mode&#xff09;&#xff0c;兩者的核心區別在于 資源調度范圍 和 Driver 進程的位置。 一、核心概念對比 維度--master&#xff08;運行模式&#xff09;--deploy-mode&#xff08;部署…

sqli—labs第八關——布爾盲注

一&#xff1a;確定注入類型 按照我們之前的步驟來 輸入 ?id1 and 11-- ?id1 and 12-- 界面正常 第二行界面異常空白 所以注入類型為單引號閉合型 二&#xff1a; 布爾盲注 1.判斷是否使用條件 &#xff08;1&#xff09;&#xff1a;存在注入但不會直接顯示查詢結果 …

ARP 原理總結

&#x1f310; 一、ARP 原理總結 ARP&#xff08;Address Resolution Protocol&#xff09;是用于通過 IP 地址解析 MAC 地址的協議&#xff0c;工作在 鏈路層 與 網絡層之間&#xff08;OSI 模型的第三層與第二層之間&#xff09;。 &#x1f501; ARP通信過程&#xff1a; …