標籤:java 基礎 list 集合 遍曆
首先,這是一個極其簡單的問題,大牛可忽略,新手可能會遇到,Java中遍曆某個List 時刪除該List元素 會拋出異常。
這一個簡單的問題再高手嚴重不值一提,但新手可能會比較困惑,用哪種方式可以安全有效實現遍曆list刪除某些特徵元素?
方式:
方法1、普通for迴圈 遍曆List,刪List除自身 特徵條目;
方法2、進階for迴圈 遍曆List,刪除List自身 特定條目;
方法3、引入參考List,for迴圈遍曆刪除原List 特定條目;
方法4、利用iterator 遍曆刪除List特定條目
結論:
方法1:不會拋異常 但結果 未必正確 由於list.size()在變動 根據腳標刪除的未必是 特徵元素;
方法2:會拋異常 :java.util.ConcurrentModificationException;
java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:819)
at java.util.ArrayList$Itr.next(ArrayList.java:791)
方法3:可實現目的,通過引入一個參考list for迴圈遍曆參考list 在迴圈過程中 滿足條件出 刪除原list條目,可以達到所需目的;
方法4:可實現目的,通過list.iterator();方法拿到iterator對象 調用iterator.remove();方法可達到所需目的且不會拋異常。
這個問題 最好親自運行代碼,嘗試,方能更好理解。
不廢話,上代碼,自己運行一下便可:
package com.kevin.test;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.Random;/** * 動態刪除 List 特徵元素 樣本 * * @author blj * */public class TestMain{static class Bean{private String name;public String getName(){return name;}public void setName(String name){this.name = name;}}/** * @param args */public static void main(String[] args){dynamicRemoveItemFromListDemo();}/** * 動態刪除List元素樣本 */public static void dynamicRemoveItemFromListDemo(){List<Bean> list = getList();System.out.println("未經處理資料:");printList(list);// 使用普通for迴圈遍曆List刪除自身元素 不報錯 但結果 未必正確normalRemoveMethod(list);// 使用進階for迴圈遍曆List刪除自身元素 報錯// try// {// superRemoveMethod(list);// }// catch (Exception e)// {// System.err.println("進階for迴圈報錯:");// e.printStackTrace();// }// 引入參考List 遍曆刪除方法// referenceRemoveMethod(list);// iterator遍曆刪除方法// iteratorRemoveMethod(list);System.out.println("結果資料:");printList(list);}/** * 列印 List 方法 * * @param list */private static void printList(List<Bean> list){for (Bean item : list){System.out.print(item.getName() + " ");}System.out.println();}/** * 利用普通for迴圈遍曆刪除元素 * * @param list */private static void normalRemoveMethod(List<Bean> list){for (int i = 0; i < list.size(); i++){if (list.get(i).getName().equals("A")){list.remove(list.get(i));}}}/** * 利用進階for迴圈遍曆刪除元素(會報異常) * * @param list */private static void superRemoveMethod(List<Bean> list){// 方法一for (Bean item : list){if (item.getName().equals("A")){list.remove(item);}}}/** * 有效for迴圈遍曆刪除元素(正常 達到預期目的) * * @param list */private static void referenceRemoveMethod(List<Bean> list){List<Bean> referenceList = new ArrayList<Bean>();referenceList.addAll(list);for (int i = 0; i < referenceList.size(); i++){if (referenceList.get(i).getName().equals("A")){list.remove(referenceList.get(i));}}}/** * 使用Iterator的方式也可以順利刪除和遍曆 */public static void iteratorRemoveMethod(List<Bean> list){Iterator<Bean> it = list.iterator();while (it.hasNext()){Bean student = it.next();if (student.getName().equals("A"))it.remove();}}/** * 擷取List方法 * * @return */private static List<Bean> getList(){List<Bean> list = new ArrayList<Bean>();for (int i = 0; i < 50; i++){Bean item = new Bean();int j = i + new Random().nextInt();if (j % 3 == 1){item.setName("A");}else if (j % 3 == 2){item.setName("B");}else{item.setName("C");}list.add(item);}return list;}}
Java動態 遍曆List 時刪除List特徵元素 異常問題 及解決方式總結