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

Java List 接口特有方法全解析:ArrayList 角標操作、子列表、ListIterator 雙向遍歷實戰

     編輯:Java 綜合教學

List 與 Collection 差異

List 繼承 Collection,新增有序、可重複、支援索引特性,所有角標相關方法均為 List 特有。

List 特有方法分類速查

分類方法簽名說明
添加void add(int index, E element)指定位置插入,後續元素右移
boolean addAll(int index, Collection c)指定位置批量插入
刪除E remove(int index)刪除指定位置,返回被刪元素,後續元素左移
修改E set(int index, E element)替換指定位置,返回舊元素
查詢E get(int index)獲取指定位置元素
List subList(int from, int to)返回 [from, to) 視圖,底層共享數組
int indexOf(Object o) / lastIndexOf(Object o)首次/最後一次出現索引,不存在返回 -1
迭代器ListIterator listIterator() / listIterator(int index)雙向迭代器,支援前向/後向、添加、修改

ArrayList 完整實戰

import java.util.*;

public class ListDemo {
    public static void main(String[] args) {
        ArrayList list = new ArrayList<>(Arrays.asList("Java基礎", "集合框架", "多線程"));
        System.out.println("原列表: " + list); // [Java基礎, 集合框架, 多線程]

        // 1. 指定位置插入
        list.add(1, "JVM調優");  // 索引 1 插入
        System.out.println("插入後: " + list); // [Java基礎, JVM調優, 集合框架, 多線程]

        // 2. 刪除指定位置
        String removed = list.remove(2); // 刪除 "集合框架"
        System.out.println("刪除: " + removed + " -> " + list); // [Java基礎, JVM調優, 多線程]

        // 3. 修改元素
        String old = list.set(1, "JVM深度調優");
        System.out.println("修改: " + old + " -> " + list.get(1)); // JVM調優 -> JVM深度調優

        // 4. 獲取元素
        System.out.println("get(0): " + list.get(0)); // Java基礎

        // 5. 子列表視圖
        List sub = list.subList(0, 2); // [Java基礎, JVM深度調優]
        System.out.println("subList: " + sub);
        sub.set(0, "Java核心"); // 影響原列表
        System.out.println("原列表受影響: " + list.get(0)); // Java核心

        // 6. 索引查找
        System.out.println("indexOf('多線程'): " + list.indexOf("多線程")); // 2

        // 7. 普通 Iterator (單向)
        System.out.println("--- Iterator ---");
        for (Iterator it = list.iterator(); it.hasNext(); ) {
            System.out.println(it.next());
        }

        // 8. ListIterator 雙向 + 修改/添加
        System.out.println("--- ListIterator 正向 ---");
        ListIterator li = list.listIterator();
        while (li.hasNext()) {
            String s = li.next();
            if ("JVM深度調優".equals(s)) li.set("JVM極致調優"); // 修改
        }
        System.out.println("--- ListIterator 反向 ---");
        while (li.hasPrevious()) {
            System.out.println(li.previous()); // 多線程, JVM極致調優, Java核心
        }
        System.out.println("最終列表: " + list); // [Java核心, JVM極致調優, 多線程]

        // 9. 遍歷中安全添加 (僅 ListIterator 支援)
        ListIterator li2 = list.listIterator();
        while (li2.hasNext()) {
            if ("Java核心".equals(li2.next())) li2.add("新增元素");
        }
        System.out.println("添加後: " + list); // [Java核心, 新增元素, JVM極致調優, 多線程]
    }
}

關鍵區別:Iterator vs ListIterator

特性IteratorListIterator
方向單向 (next)雙向 (next/previous)
修改remove()remove() / set() / add()
定位無nextIndex() / previousIndex()
獲取方式collection.iterator()list.listIterator()
適用集合所有 Collection僅 List

ConcurrentModificationException 避坑

// ❌ 錯誤:遍歷中直接調用 list.remove()
for (String s : list) { if ("X".equals(s)) list.remove(s); } // 拋 CME

// ✅ 正確:用 Iterator.remove()
Iterator it = list.iterator();
while (it.hasNext()) { if ("X".equals(it.next())) it.remove(); }

// ✅ 正確:用 ListIterator.add/set (僅 List)
ListIterator li = list.listIterator();
while (li.hasNext()) { if ("X".equals(li.next())) li.set("Y"); }

總結

List 接口在 Collection 基礎上增加索引語義,ArrayList 以動態數組實現,隨機訪問 O(1),插入刪除 O(n)。掌握 add/remove/set/get/subList/indexOf/listIterator 九大特有方法,並熟練使用 ListIterator 進行雙向遍歷、安全修改/添加,是高效操作有序集合的核心技能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved