您的位置:

Java迭代器Iterator

一、Iterator概述

Iterator是Java中内置的一种迭代器,主要用于遍历和操作集合中的元素。使用Iterator可以在遍历集合时移除集合中的元素而不会出现ConcurrentModificationException异常。

Java中所有的集合类都实现了Iterable接口,其接口中声明了一个iterator方法,返回一个Iterator对象。通过调用Iterator对象的next()方法可以获取集合的下一个元素,调用hasNext()方法可以检查集合是否还有元素可以遍历,调用remove()方法可以在遍历集合的同时,移除集合中的元素。

二、Iterator和For-each循环的对比

在遍历集合时,通常使用Iterator或For-each循环。Iterator可以在遍历时任意移除元素,而For-each循环则不支持集合的修改操作。

例如,我们有一个List集合list,其中存放了整型元素。我们想要移除所有小于5的元素。

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

    // 使用Iterator移除小于5的元素
    Iterator<Integer> iterator = list.iterator();
    while (iterator.hasNext()) {
        Integer item = iterator.next();
        if (item < 5) {
            iterator.remove(); // 可以在遍历时移除元素
        }
    }

    // 使用For-each循环不能移除元素
    for (Integer item : list) {
        if (item < 5) {
            list.remove(item); // For-each循环不支持修改操作,会抛出ConcurrentModificationException异常
        }
    }

三、Iterator与多线程

Iterator本身不是线程安全的,因此在使用时需要注意。如果在遍历集合时,在其他线程中修改了集合,会抛出ConcurrentModificationException异常。

例如下面的代码,在两个线程中分别遍历集合list,并尝试修改元素,会抛出ConcurrentModificationException异常。

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

    new Thread(() -> {
        Iterator<Integer> iterator = list.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
            list.add(6); // 在其他线程中修改集合
        }
    }).start();

    new Thread(() -> {
        list.remove(3); // 在其他线程中修改集合
    }).start();

四、Iterator的优化

在遍历集合时,我们常常需要检索集合元素的值,此时可以使用迭代器中的forEachRemaining方法,遍历集合中剩余未迭代的元素,这样可以避免在每次迭代时都调用一次hasNext方法。

例如下面的代码:

    List<String> list = new ArrayList<>();
    list.add("hello");
    list.add("world");
    list.add("java");

    Iterator<String> iterator = list.iterator();
    String value = null;
    while (iterator.hasNext()) {
        value = iterator.next();
        System.out.println(value);
    }

    // 使用forEachRemaining方法
    iterator = list.iterator();
    iterator.next();
    iterator.forEachRemaining(System.out::println);

五、Iterator的实现原理

Iterator的底层是通过调用集合的迭代器方法返回一个实现了Iterator接口的内部类,该内部类持有集合的引用,可以遍历集合中的元素。在遍历集合时,通过调用集合的遍历方法实现元素的获取和移除。因此,Iterator的实现依赖于集合的具体实现。

例如,在ArrayList中,如果在遍历集合时调用了remove方法,则会通过调用ArrayList的remove方法来实现元素的移除操作。而在LinkedList中,如果在遍历集合时调用了remove方法,则会先将集合转为列表迭代器,再通过列表迭代器的remove方法来实现元素的移除操作。

六、总结

Iterator是Java中常用的遍历集合的工具,可以在遍历集合时安全地修改集合,是集合类的基础功能之一。使用Iterator时需要注意多线程问题,以及一些代码优化技巧,可以提高代码效率。