使用 for (int i = 0; i < list.size(); i++) 遍歷並刪除 List 元素時,往往發現並非所有元素都被刪除。例如:
List list = new LinkedList<>();
list.add("a"); list.add("b"); list.add("c"); list.add("d"); list.add("e");
for (int i = 0; i < list.size(); i++) {
list.remove(i);
}
System.out.println("剩餘元素個數:" + list.size()); // 輸出 2,而非預期的 0
刪除元素後,後續元素索引前移,而循環變量 i 仍遞增,導致跳過本應刪除的元素。實際刪除的是索引 0、2、4(即 a、c、e),b、d 倖存。
for (int i = list.size() - 1; i >= 0; i--) {
list.remove(i);
}
for (int i = 0; i < list.size(); i++) {
list.remove(i);
i--; // 抵消索引前移
}
Iterator it = list.iterator();
while (it.hasNext()) {
it.next();
it.remove(); // 安全刪除
}
list.removeIf(e -> true); // 刪除所有
Iterator 或 removeIf,代碼清晰且線程安全(單線程下)。