关于集合中元素的删除

先看段代码

public static void main(String[] args) {
        Collection collection = new ArrayList();

        collection.add(1);
        collection.add(2);
        collection.add(3);

        Iterator iterator = collection.iterator();
        while(iterator.hasNext()){
            Object next = iterator.next();

            System.out.println(next);
        }

    }

这样遍历集合是没有问题的。
但是如果像这样

public static void main(String[] args) {
        Collection collection = new ArrayList();


		//没添加元素之前就获取迭代器 或者说获取迭代器之后集合又发生了改变
        Iterator iterator = collection.iterator();
        collection.add(1);
        collection.add(2);
        collection.add(3);

        while(iterator.hasNext()){
            Object next = iterator.next();
            System.out.println(next);
        }

    }

会报ConcurrentModification异常。
在这里插入图片描述
通俗点:迭代器就类似于一个快照,获取之后就不能改变了。如果改变,在通过迭代器获取元素的时候,就会报ConcurrentModificationException.

所以,在迭代集合元素的过程中,不能调用remove方法,删除元素。

 public static void main(String[] args) {
        Collection collection = new ArrayList();

        Iterator iterator = collection.iterator();
        collection.add(1);
        collection.add(2);
        collection.add(3);

        while(iterator.hasNext()){
            Object next = iterator.next();
            //集合发生改变了  在调用迭代器的next方法 会报异常
            collection.remove(next);
            System.out.println(next);
        }
        
    }

所以报
在这里插入图片描述

那么我们应该如何删除集合中的元素呢?
我们可以应迭代器删除。

public static void main(String[] args) {
        Collection collection = new ArrayList();

        Iterator iterator = collection.iterator();
        collection.add(1);
        collection.add(2);
        collection.add(3);

        while(iterator.hasNext()){
            Object next = iterator.next();
          
            //使用迭代器删除 把快照中的元素删除后,迭代器对应的集合中的元素也就删除
            //这样就保持了快照和集合中元素一致
            iterator.remove();
           
            System.out.println(next);
        }

    }

成功删除,不会报错。
结论:
两种删除集合中的元素的方式:

1.Collection.remove(Object o) 集合中的remove方法
2.Iterrator.remove()迭代器中的remove方法.

结论:
a.使用集合删除元素时,迭代器获取的快照,发现原集合状态发生改变,快照还是原集合的快照。导致了状态不一致,会报ConcurrentModificationException。
如果坚持使用集合删除元素,需要更新迭代器。也就是要重新获取迭代器。
b.使用迭代器删除元素时,会自动更新迭代器,同时更新集合(同时删除集合中的元素)
删除元素时,建议使用迭代器删除。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值