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

Java List 遍歷刪除元素導致索引錯位?反向遍歷或 Iterator.remove 解決

     編輯:程式設計綜合問答

錯誤代碼

for (int i = 0; i < list.size(); i++) {
    if (list.get(i).getSno().equals(sno)) {
        list.remove(i); // 刪除後後續元素前移,i++ 導致跳過下一個
    }
}

現象

刪除第 0 項後,原第 1 項變為第 0 項,迴圈 `i` 變 1 → **漏檢新第 0 項**。連續刪除更嚴重。

正確解法三選一

1. 反向遍歷(最簡單、效能佳)

for (int i = list.size() - 1; i >= 0; i--) {
    if (list.get(i).getSno().equals(sno)) {
        list.remove(i);
    }
}

2. Iterator.remove(標準、支援泛型、安全)

Iterator it = list.iterator();
while (it.hasNext()) {
    if (it.next().getSno().equals(sno)) {
        it.remove(); // 唯一安全在迭代中修改 List 的方式
    }
}

3. Java 8 Stream 過濾(函數式、不可變風格)

list = list.stream()
    .filter(s -> !s.getSno().equals(sno))
    .collect(Collectors.toList());

為什麼原代碼「分兩個迴圈」看起來正常?

第一個迴圈刪除,**但 `i++` 導致漏檢**;第二個迴圈在**已縮減的 List** 上遍歷,看似正常,實則資料已損壞(漏刪/漏存)。

總結

**遍歷中刪除 List 元素:反向 `for`、Iterator.remove、Stream filter 三選一**。正向 `for` + `remove(i)` 是經典 Bug,代碼審查必查項目。

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