关于Java集合中元素的删除问题详解

关于Java集合中元素的删除问题详解_Tommy·Vercetti 的博客-CSDN博客

在集合遍历(迭代)过程中,不允许元素通过集合删除,可以通过迭代器进行删除因为在集合进行迭代过程中,不允许集合的结构发生改变

import java.io.BufferedReader;
import java.util.*;
@SuppressWarnings({"all"})
public class interate{
    public static void main(String[] args) {
        Collection c = new ArrayList();
        Iterator it = c.iterator(); //此时的迭代器是指向空的集合的迭代器
        /*
        因为设置了迭代器后,集合的结构发生了改变
        注解:只要集合的结构繁盛了改变,迭代器必须重新获取。
        不允许这种情况,所以程序在运行后报异常:
        java.util.ConcurrentModificationException
        */
        c.add(1);
        c.add(2);
        c.add(3);
        c.add(4); //此时集合的状态发生了改变,而迭代器没有得到更新,所以抛出异常
        while(it.hasNext()){
            Object obj = it.next();
            System.out.println(obj);
        }
    }
}
1234567891011121314151617181920212223

错误样式二:

import java.io.BufferedReader;
import java.util.*;
@SuppressWarnings({"all"})
public class interate{
    public static void main(String[] args) {
        Collection c = new ArrayList();
        
        c.add(1);
        c.add(2);
        c.add(3);
        c.add(4);
        Iterator it = c.iterator();
        while(it.hasNext()){
            Object obj = it.next();
            c.remove(); //抛出异常。
            System.out.println(obj);
        }
    }
}
12345678910111213141516171819

正确方式:

import java.io.BufferedReader;
import java.util.*;
@SuppressWarnings({"all"})
public class interate{
    public static void main(String[] args) {
        Collection c = new ArrayList();
        
        c.add(1);
        c.add(2);
        c.add(3);
        c.add(4);
        Iterator it = c.iterator();
        while(it.hasNext()){
            Object obj = it.next();
            it.remove(); //正确
            System.out.println(obj);
        }
    }
}
12345678910111213141516171819

利用迭代器进行删除操作,这样进行的删除操作会同步到集合和迭代器,所以可以实现正确的删除元素,但是如果按照删除集合中的元素,那么会抛出异常,无法实现和迭代器的集合元素相匹配。

执行Iterator it = c.iterator()时,相当于对集合拍了一个快照,迭代器进行迭代时会参照这个快照进行迭代。

直接在集合中删除元素并没有通知迭代器,导致二者在遍历时不同步,报异常。

而通过迭代器去删除时,再删除集合中元素的同时,也把迭代器中的元素删除了,这样就实现了迭代器和原来集合的同步,不会报异常。

所以集合结构发生改变时,必须重新获取迭代器。

在迭代元素的过程中,一定要使用Iterator的remove方法删除元素,不要使用集合的删除方法。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值