List遍歷中刪除元素

List遍歷主要有索引下標遍歷、for循環遍歷和Iterator迭代遍歷,索引下標和for循環在遍歷中刪除元素都存在問題,Iterator迭代可以實現遍歷中刪除元素。

索引下標遍歷

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(2);
list.add(3);
list.add(5);
list.add(6);
list.add(3);
list.add(4);

for(int i = 0; i < list.size(); i++){
    if(list.get(i).intValue() == 3){
        list.remove(i);
    }
}

System.out.println(list);
//結果 [1, 2, 2, 5, 6, 4]
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(2);
list.add(3);
list.add(5);
list.add(6);
list.add(3);
list.add(4);

for(int i = 0; i < list.size(); i++){
    if(list.get(i).intValue() == 2){
        list.remove(i);
    }
}

System.out.println(list);
//結果 [1, 2, 3, 5, 6, 4, 3]

遍歷方式中刪除元素並不會拋出異常,只是存在漏刪元素的情況。
集合在刪除值爲3的元素時,能正確的刪除兩個元素。當刪除值爲2的元素時,只刪除第一個元素。原因是刪除了第一個2後,集合裏的元素個數減1,後面的元素往前移了1位,導致了第二個2被遺漏了。

for循環遍歷

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(2);
list.add(3);
list.add(5);
list.add(6);
list.add(3);
list.add(4);

for(Integer item : list){
    if(item.intValue() == 3){
        list.remove(item);
    }
}

System.out.println(list);

該代碼運行會拋出異常ConcurrentModificationException

Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
    at java.util.ArrayList$Itr.next(ArrayList.java:831)個
    at com.yihaodian.mobile.flume.client.ListDeleteTest.main(ListDeleteTest.java:19)

ConcurrentModificationException官方描述如下:
當併發修改對象,而這時對該對象的修改是不允許的,就會拋出該異常。例如,當一個線程在遍歷集合的時候,其他線程不允許修改該集合。通常情況下,在遍歷時修改集合,迭代結果通常是不確定的。有些迭代器檢測到這種行爲,就會拋出ConcurrentModificationException異常。

Iterator遍歷

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(2);
list.add(3);
list.add(5);
list.add(6);
list.add(3);
list.add(4);

Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext()){
    Integer item = iterator.next();
    if(item.intValue() == 2){
        iterator.remove();
    }
}

System.out.println(list);
//結果 [1, 3, 5, 6, 4, 3]

Iterator能正確的刪除集合中的元素,在遍歷中刪除元素推薦用這種方法。

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