1. 程式人生 > >java中遍歷集合刪除元素的方法

java中遍歷集合刪除元素的方法

報錯示例一:

List<String> list = new ArrayList<>();

list.add("1");
list.add("2");
list.add("3");
list.add("4");

for(String str : list){
    if(!str.equals("1")) {
        list.remove(str);
    }
}
System.out.println(list.size());

錯誤使用二:這種情況不會報錯,因為最後一個元素未被遍歷到就程式跳出了迴圈遍歷

List<String> list = new ArrayList<>();

list.add("1");
list.add("2");
list.add("3");

for(String str : list){
    if(!str.equals("1")) {
        list.remove(str);
    }
}
System.out.println(list.size());

方法一:for迴圈遍歷

List<String> list = new ArrayList<>();

list.add("1");
list.add("2");
list.add("3");

for (int i = 0; i < list.size(); i++) {
    String item = list.get(i);
    if("2".equals(item)) {
        //邏輯判斷,剔除滿足條件的元素
        list.remove(item);
        //元素刪除後,後面的元素位置向前挪一位,位置索引i需要自減一,否則訪問不到後面的元素
        i--;
    }
}
System.out.println(list.size());

方法二:使用集合的迭代器

List<String> list = new ArrayList<>();

list.add("1");
list.add("2");
list.add("3");

for(Iterator<String> it = list.iterator(); it.hasNext(); ){
    if("2".equals(it.next())) {
        //使用迭代器的刪除方法,不要使用集合物件的刪除方法remove
        it.remove();
    }
}
System.out.println(list.size());

原因說明:

1、如果使用增強for迴圈進行遍歷,那麼實際上使用的是集合的迭代器進行遍歷,這時如果使用的是集合物件自己的刪除方法,迭代器不知道元素集合發生了變化,進行獲取下一個元素的時候就會爆出錯誤:ConcurrentModificationException,但這裡有一點需要注意,如果遍歷過程中第一個被刪除的元素處在倒數第二個被遍歷的位置時,程式不會報錯,正常結束。實際的結果是:集合中最後一個元素之前,會呼叫迭代器的hasNext()方法,該方法發現當前位置索引等於集合元素數量,判斷遍歷結束,跳出迴圈,實則最後一個元素未被遍歷到。

2、第一種遍歷刪除方法,是自己控制並調整元素位置索引,只要位置索引控制正確,就可以正常刪除元素,否則會出現IndexOutOfBoundsException

3、第二種遍歷刪除直接使用迭代器進行遍歷,而且刪除時使用的迭代器的刪除元素方法,這個刪除方法裡面會對位置索引進行調整,使得迭代器在繼續遍歷查詢下一個元素時,不會