List集合在遍歷的同時刪除元素

使用增強for循環會報ConcurrentModificationException異常,可以採用iterator遍歷,或者普通for循環遍歷

1. 使用Iterator的remove()方法

使用Iterator的remove()方法的實現方式如下所示:

public static void main(String[] args) {
    List<String> platformList = new ArrayList<>();
    platformList.add("博客園");
    platformList.add("CSDN");
    platformList.add("掘金");

    Iterator<String> iterator = platformList.iterator();
    while (iterator.hasNext()) {
        String platform = iterator.next();
        if (platform.equals("博客園")) {
            iterator.remove();
        }
    }

    System.out.println(platformList);
}

輸出結果爲:

[CSDN, 掘金]

爲什麼使用iterator.remove();就可以呢?

讓我們看下它的源碼:

可以看出,每次刪除一個元素,都會將modCount的值重新賦值給expectedModCount,這樣2個變量就相等了,不會觸發java.util.ConcurrentModificationException異常。更多面試題,歡迎關注公衆號 Java面試題精選

2. 使用for循環正序遍歷

使用for循環正序遍歷的實現方式如下所示:

public static void main(String[] args) {
    List<String> platformList = new ArrayList<>();
    platformList.add("博客園");
    platformList.add("CSDN");
    platformList.add("掘金");

    for (int i = 0; i < platformList.size(); i++) {
        String item = platformList.get(i);

        if (item.equals("博客園")) {
            platformList.remove(i);
            i = i - 1;
        }
    }

    System.out.println(platformList);
}

這種實現方式比較好理解,就是通過數組的下標來刪除,不過有個注意事項就是刪除元素後,要修正下下標的值:

i = i - 1;

爲什麼要修正下標的值呢?

因爲剛開始元素的下標是這樣的:

第1次循環將元素"博客園"刪除後,元素的下標變成了下面這樣:

第2次循環時i的值爲1,也就是取到了元素”掘金“,這樣就導致元素"CSDN"被跳過檢查了,所以刪除完元素後,我們要修正下下標,這也是上面代碼中i = i - 1;的用途。

3. 使用for循環倒序遍歷

使用for循環倒序遍歷的實現方式如下所示:

public static void main(String[] args) {
    List<String> platformList = new ArrayList<>();
    platformList.add("博客園");
    platformList.add("CSDN");
    platformList.add("掘金");

    for (int i = platformList.size() - 1; i >= 0; i--) {
        String item = platformList.get(i);

        if (item.equals("掘金")) {
            platformList.remove(i);
        }
    }

    System.out.println(platformList);
}

這種實現方式和使用for循環正序遍歷類似,不過不用再修正下標,因爲剛開始元素的下標是這樣的:

第1次循環將元素"掘金"刪除後,元素的下標變成了下面這樣:

第2次循環時i的值爲1,也就是取到了元素”CSDN“,不會導致跳過元素,所以不需要修正下標。

4. 還可以使用java8的filter過濾出元素

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章