Java List 使用詳解:從入門到精通

一、List 基礎概念

1.1 什么是 List?

List 就像是一個智能書架

  • 可以按順序存放書籍(元素)
  • 每本書都有固定位置(索引)
  • 可以隨時添加、取出或重新排列書籍
// 創建一個書架(List)
List<String> bookshelf = new ArrayList<>();

1.2 List 的核心特性

特性說明生活類比
有序性元素按添加順序存儲書架上的書按放入順序排列
可重復允許相同元素多次出現同一本書可以有多個副本
索引訪問通過位置編號快速獲取元素通過書架編號找書
動態擴容自動調整存儲空間智能書架自動擴展

1.3 List 家族成員

二、List 基本操作?

2.1 創建 List 的三種方式

// 方式1:標準創建(推薦)
List<String> fruits = new ArrayList<>();// 方式2:快速初始化
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// 方式3:不可變列表(Java 9+)
List<String> colors = List.of("紅", "綠", "藍");

2.2 添加元素 - 豐富你的書架

fruits.add("蘋果");     // 末尾添加
fruits.add(0, "香蕉");  // 指定位置插入
fruits.addAll(Arrays.asList("橙子", "葡萄")); // 批量添加System.out.println(fruits); 
// 輸出: [香蕉, 蘋果, 橙子, 葡萄]

2.3 訪問元素 - 查找書籍

// 獲取單個元素
String firstFruit = fruits.get(0); // "香蕉"// 檢查元素是否存在
boolean hasApple = fruits.contains("蘋果"); // true// 查找元素位置
int appleIndex = fruits.indexOf("蘋果"); // 1

2.4 修改元素 - 替換書籍

// 替換指定位置的元素
String oldFruit = fruits.set(1, "青蘋果");
System.out.println("被替換的水果: " + oldFruit); // "蘋果"

2.5 刪除元素 - 清理書架

// 按索引刪除
String removed = fruits.remove(0); // 刪除"香蕉"// 按元素值刪除
boolean isRemoved = fruits.remove("葡萄"); // true// 批量刪除
fruits.removeAll(Arrays.asList("橙子", "青蘋果"));// 清空書架
fruits.clear();

三、遍歷 List 的多種方式?

3.1 基礎遍歷方法

// 1. for循環(索引訪問)
for (int i = 0; i < fruits.size(); i++) {System.out.println((i+1) + ". " + fruits.get(i));
}// 2. 增強for循環
for (String fruit : fruits) {System.out.println(fruit);
}

3.2 使用迭代器

// 3. Iterator遍歷
Iterator<String> iterator = fruits.iterator();
while (iterator.hasNext()) {String fruit = iterator.next();if (fruit.equals("葡萄")) {iterator.remove(); // 安全刪除}
}

3.3 Java 8+ 高級遍歷

// 4. forEach方法
fruits.forEach(fruit -> System.out.println(fruit));// 5. 方法引用
fruits.forEach(System.out::println);// 6. 并行流遍歷(大數據量)
fruits.parallelStream().forEach(fruit -> {// 并行處理邏輯
});

3.4 遍歷性能對比

遍歷方式10萬元素耗時適用場景
for循環5ms需要索引時
增強for7ms簡單遍歷
Iterator8ms需要刪除元素時
forEach10ms函數式編程
并行流3ms大數據量處理

四、List 高級操作?

4.1 排序操作

List<Integer> numbers = Arrays.asList(5, 2, 9, 1, 3);// 自然排序(升序)
Collections.sort(numbers);
// 輸出: [1, 2, 3, 5, 9]// 自定義排序(降序)
numbers.sort((a, b) -> b - a);
// 輸出: [9, 5, 3, 2, 1]// 對象排序
List<Book> books = new ArrayList<>();
books.add(new Book("Java編程", 99));
books.add(new Book("Python入門", 69));books.sort(Comparator.comparing(Book::getPrice));

4.2 過濾與轉換

// 過濾高價水果
List<String> expensiveFruits = fruits.stream().filter(fruit -> fruit.length() > 2).collect(Collectors.toList());// 水果名稱轉大寫
List<String> upperCaseFruits = fruits.stream().map(String::toUpperCase).collect(Collectors.toList());

4.3 數學統計

IntSummaryStatistics stats = numbers.stream().mapToInt(Integer::intValue).summaryStatistics();System.out.println("最大值: " + stats.getMax());
System.out.println("最小值: " + stats.getMin());
System.out.println("平均值: " + stats.getAverage());
System.out.println("總數: " + stats.getSum());

4.4 列表轉換

// List轉數組
String[] fruitArray = fruits.toArray(new String[0]);// 數組轉List(不可修改)
List<String> fixedList = Arrays.asList(fruitArray);// 數組轉List(可修改)
List<String> modifiableList = new ArrayList<>(Arrays.asList(fruitArray));

五、ArrayList 深度解析?

5.1 內部結構

ArrayList 就像是一個智能伸縮書架

// 簡化版ArrayList實現
public class SimpleArrayList<E> {private Object[] elements; // 存儲元素的數組private int size;          // 當前元素數量public SimpleArrayList() {this.elements = new Object[10]; // 初始容量}public void add(E element) {// 當數組滿時自動擴容if (size == elements.length) {Object[] newArray = new Object[elements.length * 2];System.arraycopy(elements, 0, newArray, 0, size);elements = newArray;}elements[size++] = element;}
}

5.2 擴容機制

5.3 性能特點

操作時間復雜度說明
get(index)O(1)直接通過索引訪問
add(element)O(1)平均時間復雜度
add(index, element)O(n)需要移動后續元素
remove(index)O(n)需要移動后續元素
contains(element)O(n)需要遍歷查找

六、LinkedList 深度解析

6.1 內部結構

LinkedList 就像是一個帶前后指針的書本鏈

// 簡化版鏈表節點
class Node<E> {E item;         // 當前元素Node<E> next;   // 下一個節點Node<E> prev;   // 上一個節點Node(Node<E> prev, E element, Node<E> next) {this.item = element;this.next = next;this.prev = prev;}
}

6.2 操作原理

// 在指定位置插入元素
public void add(int index, E element) {// 1. 找到目標位置的節點Node<E> target = getNode(index);// 2. 創建新節點Node<E> newNode = new Node<>(target.prev, element, target);// 3. 調整前后節點指針target.prev.next = newNode;target.prev = newNode;
}

6.3 性能對比 ArrayList

操作ArrayListLinkedList適用場景
隨機訪問?? 快 (O(1))🐢 慢 (O(n))需要頻繁按索引訪問
頭部插入🐢 慢 (O(n))?? 快 (O(1))需要頻繁在開頭添加
尾部插入?? 快 (O(1))?? 快 (O(1))在末尾添加
中間插入🐢 慢 (O(n))?? 快 (O(1))需要頻繁在中間插入
內存占用較少(僅需存儲元素)較多(每個元素需要額外指針)內存敏感場景

七、實戰應用案例

7.1 學生成績管理系統

class Student {private String name;private int score;// 構造方法、getter/setter省略
}public class GradeSystem {private List<Student> students = new ArrayList<>();// 添加學生public void addStudent(Student student) {students.add(student);}// 按分數排序public void sortByScore() {students.sort(Comparator.comparingInt(Student::getScore).reversed());}// 查找前N名學生public List<Student> getTopStudents(int n) {return students.stream().sorted(Comparator.comparingInt(Student::getScore).reversed()).limit(n).collect(Collectors.toList());}// 統計分數分布public Map<String, Long> getScoreDistribution() {return students.stream().collect(Collectors.groupingBy(s -> {int score = s.getScore();if (score >= 90) return "優秀";if (score >= 80) return "良好";if (score >= 60) return "及格";return "不及格";},Collectors.counting()));}
}

7.2 購物車實現

class CartItem {private String productId;private String name;private double price;private int quantity;// 構造方法、getter/setter省略
}public class ShoppingCart {private List<CartItem> items = new LinkedList<>();// 添加商品public void addItem(CartItem newItem) {// 檢查是否已存在for (CartItem item : items) {if (item.getProductId().equals(newItem.getProductId())) {item.setQuantity(item.getQuantity() + newItem.getQuantity());return;}}items.add(newItem);}// 更新數量public void updateQuantity(String productId, int newQuantity) {items.removeIf(item -> item.getProductId().equals(productId));if (newQuantity > 0) {items.add(new CartItem(productId, newQuantity));}}// 計算總價public double calculateTotal() {return items.stream().mapToDouble(item -> item.getPrice() * item.getQuantity()).sum();}// 生成訂單public Order checkout() {Order order = new Order();order.setItems(new ArrayList<>(items));order.setTotal(calculateTotal());items.clear();return order;}
}

八、最佳實踐與性能優化

8.1 選擇正確的 List 實現

場景推薦實現理由
讀多寫少ArrayList隨機訪問快
頻繁增刪LinkedList插入刪除快
多線程環境CopyOnWriteArrayList線程安全
固定大小列表Arrays.asList()內存優化
不可變列表List.of()安全簡潔

8.2 性能優化技巧

? ?預分配容量(減少擴容開銷)

// 預計存儲1000個元素
List<String> largeList = new ArrayList<>(1000);

? ? ? ?批量操作(減少方法調用)?

// 差: 多次調用add
for (String item : items) {list.add(item);
}// 好: 批量添加
list.addAll(items);

? ?

避免在循環中調用size

// 差: 每次循環都調用size()
for (int i = 0; i < list.size(); i++) {// ...
}// 好: 緩存size值
int size = list.size();
for (int i = 0; i < size; i++) {// ...
}

使用subList視圖

// 創建子列表視圖(不復制數據)
List<String> sub = list.subList(0, 5);

九、常見問題與解決方案 (30分鐘)

?ConcurrentModificationException

問題:遍歷時修改集合

List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
for (String s : list) {if ("B".equals(s)) {list.remove(s); // 拋出異常}
}

解決方案

// 1. 使用Iterator的remove方法
Iterator<String> it = list.iterator();
while (it.hasNext()) {String s = it.next();if ("B".equals(s)) {it.remove(); // 安全刪除}
}// 2. 使用Java 8+ removeIf
list.removeIf("B"::equals);// 3. 創建副本遍歷
new ArrayList<>(list).forEach(s -> {if ("B".equals(s)) {list.remove(s);}
});

性能陷阱:LinkedList的隨機訪問

問題

LinkedList<Integer> list = new LinkedList<>();
// 填充數據...// 隨機訪問性能差
for (int i = 0; i < list.size(); i++) {Integer value = list.get(i); // O(n)操作
}

解決方案

// 1. 使用迭代器
Iterator<Integer> it = list.iterator();
while (it.hasNext()) {Integer value = it.next();
}// 2. 使用增強for循環
for (Integer value : list) {// ...
}// 3. 轉換為ArrayList(只讀場景)
List<Integer> arrayList = new ArrayList<>(list);

?對象相等性判斷

問題:自定義對象在List中的行為

解決方案

class Person {String name;@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Person person = (Person) o;return Objects.equals(name, person.name);}@Overridepublic int hashCode() {return Objects.hash(name);}
}

十、總結與進階學習?

?List 知識體系總結

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

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

相關文章

Java零基礎筆記06(數組:一維數組、二維數組)

明確: 程序是用來處理數據的, 因此要掌握數據處理的數據結構數組是編程中常用的數據結構之一&#xff0c;用于存儲一系列相同類型的元素。在Java中&#xff0c;數組是一種對象&#xff0c;可以存儲固定大小的相同類型元素的集合。1.一維數組數組是一個數據容器,可用來存儲一批同…

10倍處理效率提升!阿里云大數據AI平臺發布智能駕駛數據預處理解決方案

阿里云大數據AI平臺重磅發布智能駕駛數據預處理解決方案&#xff0c;可幫助汽車行業客戶實現構建高效、穩定的數據預處理產線流程&#xff0c;數據包處理效率相比自建可提升10倍以上&#xff0c;數據處理推理任務優化提速1倍以上&#xff0c;相同資源產能提升1倍[1]&#xff0c…

SAP HANA內存數據庫解析:特性、優勢與應用場景 | 技術指南

SAP HANA 是一款列式內存關系數據庫&#xff0c;集 OLAP 和 OLTP 操作于一體。相較于同類產品&#xff0c;SAP HANA 需要的磁盤空間更少&#xff0c;并且可擴展性高。SAP HANA 可以部署在本地、公有云或私有云以及混合場景中。該數據庫適用于各種數據類型的高級分析和事務處理。…

Openharmony4.0 rk3566上面rknn的完美調用

一 背景&#xff1a; 我們都知道如果要在android上面使用rknn推理模型需要按照如下的步驟&#xff1a; 詳細請參考筆者的文章&#xff1a;Android11-rk3566平臺上采用NCNN&#xff0c;RKNN框架推理yolo11官方模型的具體步驟以及性能比較-CSDN博客 簡而言之就是 模型轉換&#…

Java多線程知識小結:Synchronized

在Java中&#xff0c;synchronized 關鍵字是實現線程同步的核心工具&#xff0c;用于保證同一時刻只有一個線程可以執行被修飾的代碼塊或方法。以下從基本原理、鎖升級過程、應用場景及優化建議四個維度詳細解析&#xff1a; 一、基本原理 1. 同步的對象 synchronized 鎖的是對…

MTK項目wifi.cfg文件如何配置的Tput和功耗參數

下面的MTK參數主要與無線網絡(Wi-Fi)配置相關,特別是與WMM(Wi-Fi Multimedia)和功率控制相關的設置 WMM相關參數: WmmParamCwMax/WmmParamCwMin:定義競爭窗口的最大/最小值,這里設置為10/4,用于控制信道訪問的退避機制13 WmmParamAifsN:仲裁幀間間隔數,設置為3影響不同…

分水嶺算法:圖像分割的浸水原理

分水嶺算法&#xff1a;基于拓撲地貌的邊界提取核心原理 分水嶺算法將圖像視為拓撲地貌&#xff0c;灰度值代表海拔高度。通過模擬浸水過程&#xff1a;局部極小值&#xff1a;對應集水盆&#xff08;區域內部&#xff09;。分水嶺線&#xff1a;集水盆之間的山脊&#xff08;區…

汽車功能安全系統階段開發【技術安全方案TSC以及安全分析】5

文章目錄1 技術安全方案 (Technical Safety Concept - TSC)2 系統安全架構設計 (System Safety Architecture Design)3 如何進行安全分析 (Safety Analysis)4 技術安全需求 (TSR) 如何分配到系統架構1 技術安全方案 (Technical Safety Concept - TSC) 技術安全方案 (Technical…

學習軟件測試的第十二天(接口測試)

一.如果一個接口請求不通&#xff0c;那么你會考慮那些方面的問題&#xff1f;如果一個接口請求不通&#xff0c;我會像“排查水管漏水”一樣一步步定位問題發生在哪一段&#xff0c;主要從這幾個方向去思考&#xff1a;當一個接口請求不通時&#xff0c;我會從以下幾個方面進行…

Linux下的C/C++開發之操作Zookeeper

ZooKeeper C 客戶端簡介與安裝ZooKeeper C API 簡介ZooKeeper 官方提供了多語言客戶端&#xff0c;C 語言客戶端是最底層的實現之一&#xff0c;功能全面且穩定&#xff0c;適合嵌入式開發、系統級組件、C 項目集成等場景。zookeeper.h 是 ZooKeeper 提供的 C 語言客戶端頭文件…

【openp2p】學習3:【專利分析】一種基于混合網絡的自適應切換方法、裝 置、設備及介質

本專利與開源項目無關,但可能是實際商用的一種專利。專利地址從此專利,可見p2p的重要性。透傳服務可能是實時轉發服務,提供中繼能力 透傳服務可以是指一種通過公網服務器將數據從第一客戶端傳遞到另一個設備 或客戶端的服務。這種服務通常用于克服網絡中的障礙,如防火墻、…

OpenCV中DPM(Deformable Part Model)目標檢測類cv::dpm::DPMDetector

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 OpenCV 中用于基于可變形部件模型&#xff08;DPM&#xff09; 的目標檢測器&#xff0c;主要用于行人、人臉等目標的檢測。它是一種傳統的基于特…

macOS 26快捷指令更新,融入AI打造智能操作體驗

快捷指令作為Mac系統中提升用戶操作效率的得力助手&#xff0c;在macOS 26中迎來了一次具有突破性的重大更新。此次更新融入了先進的AI技術&#xff0c;推出“智能操作”&#xff08;Intelligent Actions&#xff09;功能&#xff0c;讓快捷指令從簡單的自動化工具升級為真正的…

InstructBLIP:邁向具備指令微調能力的通用視覺語言模型

溫馨提示&#xff1a; 本篇文章已同步至"AI專題精講" InstructBLIP&#xff1a;邁向具備指令微調能力的通用視覺語言模型 摘要 大規模的預訓練與instruction tuning在構建通用語言模型方面已取得顯著成效。然而&#xff0c;構建通用的視覺-語言模型仍然具有挑戰性&…

基于dropbear實現嵌入式系統ssh服務端與客戶端完整交互

以下基于 Dropbear 實現 SSH 服務端與客戶端交互的完整步驟&#xff0c;涵蓋服務端部署、客戶端連接、認證配置及消息傳輸&#xff0c;結合了多篇權威資料的核心實踐&#xff1a;環境準備與安裝 服務端安裝 ? Linux 系統&#xff08;以 Ubuntu/CentOS 為例&#xff09; Ubuntu…

深圳安銳科技發布國內首款4G 索力儀!讓斜拉橋索力自動化監測更精準高效

近日&#xff0c;深圳安銳科技正式發布國內首款無線自供電、一體化的斜拉索實時監測設備 “4G索力監測儀”&#xff0c;成功攻克了傳統橋梁索體監測領域長期存在的實時性差、布設困難和成本高昂的行業難題&#xff0c;為斜拉橋、系桿拱橋提供全無線、自動化、云端實時同步的索力…

Pipeline 引用外部數據源最佳實踐

場景解析在企業網絡安全日志處理場景中&#xff0c;防火墻、入侵檢測系統&#xff08;IDS&#xff09;等設備會持續產生大量日志&#xff0c;記錄網絡流量、訪問請求、異常事件等基礎信息&#xff0c;但這些原始日志僅能呈現表面現象&#xff0c;難以全面剖析安全威脅&#xff…

UI + MCP Client + MCP Server(并且鏈接多個Server)

項目結構前端項目--------->MCP Client----------->MCP Serverserver就不過多贅述了&#xff0c;他只是相當于添加了多個的tools 鏈接前后端 http.createServer創建一個服務器// ---------------------------------------------------------------- // server.js import …

香港站群服務器與普通香港服務器對比

在選擇香港服務器時&#xff0c;用戶常常會遇到"站群服務器"和"普通服務器"兩種選項&#xff0c;雖然它們都基于香港數據中心的基礎設施&#xff0c;但在 IP 地址配置、功能定位和管理復雜度、成本上存在顯著差異&#xff0c;理解這些差異有助于用戶根據實…

4.B樹和B+樹的區別?為什么MySQL選擇B+樹作為索引?

區別&#xff1a;1.數據存儲位置B樹每個節點都存儲了索引和數據B樹只有葉子節點存儲數據&#xff0c;非葉子節點僅存儲索引2.葉子節點的鏈接B樹的所有葉子節點通過指針連接成一個雙向鏈表&#xff0c;可以高效地進行范圍查詢或者順序遍歷B樹則沒有這樣的連接關系&#xff0c;查…