手记

Iterator

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人推荐
随时随地看视频
慕课网APP