为了账号安全,请及时绑定邮箱和手机立即绑定

Iterator

标签:
Java

Iterator迭代器:

当使用迭代器遍历元素,并删除元素时,要使用迭代器内部的remove, 不能使用集合对象的remove.

    @Test
    public void testIteratorError(){
        Map<String,String> map = new HashMap<>();
        map.put("k1","v1");
        map.put("k2","v2");
        map.put("k3","v3");
        map.put("k4","v4");
        map.put("k5","v5");

        Collection<String> collection = map.values();
        //增强型for循环. 内部使用的是Iterator进行迭代.
        for (String s : collection) {
            if(s == "v2"){
                //使用集合的remove方法
                //抛出异常: java.util.ConcurrentModificationException
                collection.remove(s);
            }
        }

        System.out.println(collection);
    }

因为迭代器在删除元素时还要更新迭代器中cursor的值, 如果使用集合对象的remove,那么在使用迭代器遍历时会少遍历一些元素, 所以为了防止这种情况的发生, JDK使用了modCount来计数. 当使用迭代器.remove时会判断,是否modCount == expectedModCount, 如果相等说明没有调用过集合对象的remove方法, 如果不等就说明调用了集合对象的remove,这时再使用迭代器遍历元素时会报异常[ConcurrentModificationException].

所以应该使用迭代器内部的remove

    @Test
    public void testIterator(){
        Map<String,String> map = new HashMap<>();
        map.put("k1","v1");
        map.put("k2","v2");
        map.put("k3","v3");
        map.put("k4","v4");
        map.put("k5","v5");

        Collection<String> collection = map.values();

        //获得迭代器
        Iterator<String> iter = collection.iterator();
        while(iter.hasNext()){
            String s = iter.next();
            if (s == "v2") {
                //使用迭代器内的remove方法.
                iter.remove();
            }
        }

        System.out.println(collection);
    }
点击查看更多内容
2人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
1
获赞与收藏
31

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消