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

Java 集合框架精解(二):Set、Iterator 與 ListIterator 深度解析

     編輯:J2SE

前言

本文聚焦 Set 介面特性、Iterator 單向迭代器與 ListIterator 雙向迭代器的設計模式、方法差異與實戰程式碼。

一、 Set 介面:唯一性與高效查找

  • **繼承 Collection**,不允許重複元素(以 equals() 判斷)。
  • **核心用途**:歸屬性測試、去重、集合運算(交集、聯集、差集)。
  • **首選實作**:HashSet(雜湊表,O(1) 查找),元素需正確實作 hashCode() 與 equals()。

常見 Set 實作

實作底層結構順序特點
HashSetHashMap無序最快查找/新增/刪除
LinkedHashSetHashMap + 雙向鏈表插入順序兼具查找速度與順序
TreeSet紅黑樹自然排序/自訂 Comparator有序、範圍查詢、O(log n)

二、 Iterator:統一遍歷的輕量級介面

Iterator 為設計模式,隱藏底層容器結構,提供統一存取方式。

核心方法

  • iterator():容器回傳 Iterator,游標指向第一個元素前。
  • hasNext():是否有下一個元素。
  • next():取得下一個元素並移動游標。
  • remove():移除**上次 next() 回傳**的元素(可選操作)。

三、 ListIterator:List 專用的雙向游標

繼承 Iterator,僅適用於 List 實作,支援雙向移動與索引操作。

額外方法

  • hasPrevious() / previous():反向遍歷。
  • nextIndex() / previousIndex():取得下一個/上一個元素索引。
  • set(E e):替換上次 next()/previous() 回傳的元素。
  • add(E e):在游標位置插入元素(不移動游標)。

四、 實戰程式碼範例

import java.util.*;

public class ListTest {
    public static void main(String[] args) {
        Collection<Integer> col = new ArrayList<>(Arrays.asList(10, 20, 30));
        List<Integer> list = new LinkedList<>();
        list.addAll(col);
        list.add(40); list.add(50); list.add(60); // [10,20,30,40,50,60]
        
        displayIterator(list);  // 遍歷並移除 50
        list.remove(3);         // 移除索引 3 (元素 40) -> [10,20,30,50,60]
        displayListIterator(list);
    }

    // Iterator 單向遍歷 + 移除
    static void displayIterator(Collection<Integer> list) {
        Iterator<Integer> it = list.iterator();
        while (it.hasNext()) {
            Integer val = it.next();
            System.out.print(val + " ");
            if (val == 50) it.remove(); // 安全移除
        }
        System.out.println(); // 輸出: 10 20 30 40 50 60 (50 被移除)
    }

    // ListIterator 雙向遍歷
    static void displayListIterator(List<Integer> list) {
        ListIterator<Integer> li = list.listIterator();
        
        // 正向
        while (li.hasNext()) {
            System.out.print(li.next() + " ");
        }
        System.out.println(); // 輸出: 10 20 30 50 60
        
        // 反向
        while (li.hasPrevious()) {
            System.out.print(li.previous() + " ");
        }
        System.out.println(); // 輸出: 60 50 30 20 10
    }
}

五、 關鍵注意事項

  1. 快速失效:Iterator 非執行緒安全,遍歷過程中若結構被修改(非透過 Iterator 自身),會拋出 ConcurrentModificationException。
  2. remove() 限制:必須先呼叫 next(),且每次 next() 只能對應一次 remove()。
  3. ListIterator 游標位置:游標位於元素**之間**,索引 0 表示第一個元素之前。

六、 總結

Set 以唯一性與高效查找著稱;Iterator 統一了容器遍歷;ListIterator 為 List 提供強大的雙向游標與修改能力。實務上,優先使用增強 for 循環(內部用 Iterator),需雙向或修改時再直接用 ListIterator。

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