首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java List 集合完整入門:核心 API、迭代器模式、ArrayList 實戰與最佳實踐

     編輯:Java 相關知識

前言

java.util.List 是 Java 集合框架中**有序、可重複、可索引訪問**的核心接口。本文系統講解 List 核心特性、常用實現類、迭代器模式、實戰代碼模式與性能選型指南。

List 核心特性

  • 有序:插入順序 = 遍歷順序
  • 可重複:允許 null 和重複元素
  • 可索引:支持 get(index), set(index, e), add(index, e), remove(index)
  • 動態擴容:底層數組自動擴容,無需預估大小

主流實現類對比

核心 API 速查

實現類底層結構優點缺點適用場景
ArrayList動態數組隨機訪問 O(1)、內存緊湊、遍歷快中間增刪 O(n) 需搬移元素**默認首選**,讀多寫少、需索引訪問
LinkedList雙向鏈表頭尾增刪 O(1)、無擴容開銷隨機訪問 O(n)、內存開銷大 (Node 對象)隊列/棧、頻繁頭尾操作、大對象少索引訪問
Vector動態數組 (同步)線程安全性能差、已過時極少用,替代用 Collections.synchronizedList 或 CopyOnWriteArrayList
CopyOnWriteArrayList數組 + 寫時復制讀無鎖、遍歷安全寫入開銷大、內存佔用雙倍讀多寫極少、並發遍歷場景

迭代器模式:統一遍歷抽象

所有 Collection 實現 Iterable,提供 iterator() 返回 Iterator:

List<String> list = new ArrayList<>();
list.add("A"); list.add("B"); list.add("C");

// 1. Iterator 顯式遍歷 (通用、可刪除)
Iterator<String> it = list.iterator();
while (it.hasNext()) {
    String s = it.next();
    System.out.println(s);
    if ("B".equals(s)) it.remove(); // 安全刪除
}

// 2. 增強 for (語法糖,內部用 Iterator,不可刪除)
for (String s : list) System.out.println(s);

// 3. forEach + Lambda (Java 8+)
list.forEach(System.out::println);

// 4. Stream 流式處理
list.stream().filter(s -> s.length() > 1).forEach(System.out::println);

// 5. ListIterator (雙向、可修改、可獲取索引) - 僅 List 有
ListIterator<String> lit = list.listIterator();
while (lit.hasNext()) {
    int idx = lit.nextIndex();
    String s = lit.next();
    lit.set(s + idx); // 修改
}
lit.previous(); // 逆向

實戰示例:學生管理系統

import java.util.*;

class Student {
    String name; int age;
    Student(String name, int age) { this.name = name; this.age = age; }
    @Override public String toString() { return name + "(" + age + ")"; }
}

public class ListDemo {
    public static void main(String[] args) {
        List<Student> students = new ArrayList<>();

        // 添加
        students.add(new Student("Alice", 20));
        students.add(new Student("Bob", 22));
        students.add(1, new Student("Charlie", 19)); // 插入索引 1

        // 遍歷輸出
        System.out.println("所有學生: " + students);

        // 索引訪問
        System.out.println("第一個: " + students.get(0));

        // 修改
        students.set(1, new Student("Bob-Updated", 23));

        // 查找
        int idx = students.indexOf(new Student("Bob-Updated", 23)); // 需重寫 equals
        System.out.println("Bob 索引: " + idx);

        // 刪除
        students.remove(0); // 刪除索引 0
        students.remove(new Student("Charlie", 19)); // 刪除對象 (需 equals)

        // 批量操作
        List<Student> more = Arrays.asList(new Student("David", 21), new Student("Eve", 20));
        students.addAll(more);
        students.retainAll(Arrays.asList(new Student("Bob-Updated", 23))); // 只保留交集

        // 轉數組
        Student[] arr = students.toArray(new Student[0]);

        // 排序 (需 Comparable 或 Comparator)
        students.sort(Comparator.comparingInt(s -> s.age));
        System.out.println("按年齡排序: " + students);
    }
}

常見陷阱與避坑

方法說明時間複雜度 (ArrayList)
add(E e)尾部添加O(1) 均攤
add(int index, E e)指定位置插入O(n)
get(int index)獲取元素O(1)
set(int index, E e)替換元素O(1)
remove(int index)刪除指定位置O(n)
remove(Object o)刪除首個匹配元素O(n)
indexOf(Object o)首次出現索引O(n)
contains(Object o)是否包含O(n)
size()元素數量O(1)
isEmpty()是否為空O(1)
clear()清空O(1)
subList(from, to)視圖切片 [from, to)O(1) (視圖)
toArray()轉數組O(n)

性能優化建議

  1. 預估大小預分配:new ArrayList<>(expectedSize) 避免多次擴容複製
  2. 批量添加用 addAll:比循環 add 高效
  3. 頻繁中間增刪:考慮 LinkedList 或數據結構重設計
  4. 並發環境:CopyOnWriteArrayList (讀多寫少) 或 Collections.synchronizedList (均衡)
  5. 只讀列表:Collections.unmodifiableList(list) 或 List.of(...) (Java 9+)

總結

List 是 Java 業務開發最高頻集合。掌握 ArrayList 為主、LinkedList 為輔 的選型邏輯,熟練使用 Iterator 安全遍歷刪除、removeIf 批量刪除、subList 視圖語義、預分配優化,警惕 並發修改異常、基本類型泛型化、asList 固定長度 三大坑,即可寫出高性能、無 Bug 的列表操作代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
陷阱代碼後果解決
for 循環中 remove 導致索引錯亂for (int i=0; i漏刪/越界倒序遍歷 / Iterator.remove() / removeIf()
增強 for 中 removefor (String s : list) if(...) list.remove(s);ConcurrentModificationException用 Iterator 或 removeIf
subList 視圖修改影響原列表List<String> sub = list.subList(0,2); sub.clear();原列表前兩個被刪明確語義,或 new ArrayList<>(subList) 復制
asList 返回固定長度列表List<String> list = Arrays.asList("a","b"); list.add("c");UnsupportedOperationExceptionnew ArrayList<>(Arrays.asList(...))
基本類型無法泛型化List<int> list = new ArrayList<>();編譯錯誤用包裝類 List<Integer>