Java中已经有for eachfor index的方法来遍历集合,为何还要存在迭代器这种东西呢?其实迭代器有其它方式无法实现的功能,那就是遍历/修改的模式。两种for循环在遍历集合的时候非常方便,但是在遍历过程中,如果存在修改集合的需求,就会出现效率问题了。

这里以一个经典的例子作为解释。情景是,有一个LinkedList,在遍历过程中需要删除当前遍历到的元素。这时无论是使用remote(int location)还是remote(Object object)方法,都存在效率问题。因为根据链表的特性,这两个方法都需要从头再遍历一遍。这样,相当于两个循环嵌套,导致时间复杂度变为(O^2)。用迭代器就能很好的解决这个问题。以下是一个用迭代器的示例代码:

mBokehPoints = new LinkedList<BokehPoint>();
for (Iterator<BokehPoint> iter = mBokehPoints.iterator(); iter.hasNext();) {
    BokehPoint e = iter.next();
    if (e.updatePoint()) {
        ......
    } else {
        iter.remove();
    }
}

以上代码在遍历时使用了迭代器的remove方法来删除特定的元素,这个方法不需要重新遍历链表,而是直接将当前位置的元素删除。

当然,迭代器还有其它的意义,比如迭代器是集合遍历的基础方法,迭代器统一了遍历接口,集合中许多功能的实现都与迭代器有关(remove方法底层就是迭代器实现)。

注意:网上有好多在链表遍历时使用remove方法的代码,这是很低效的做法,需要用迭代器修正。