Java 中使用 Iterator 和 索引的不同
我们知道 Java 中可以使用 for (Type ele : Object) 的方法遍历容器,也可以用索引遍历。
使用前者实际上就是 new 了一个 Iterator,然后使用
 while (it.hasNext()) {
            it.next();
        }
来获取下一个值。
我们来看下在 ArrayList 中 it.next() 的源码。
public E next() {
    checkForComodification();
    int i = cursor;
    if (i >= size)
        throw new NoSuchElementException();
    Object[] elementData = ArrayList.this.elementData;
    if (i >= elementData.length)
        throw new ConcurrentModificationException();
    cursor = i + 1;
    return (E) elementData[lastRet = i];
}
O.get()的源码。
E elementData(int index) {
    return (E) elementData[index];
}
public E get(int index) {
    rangeCheck(index);
    return elementData(index);
}
所以如果可以 Random Access 的话,这两种方法严格上是没什么区别的,只是 Iterator 多判断了几次。
不过如果在 Sequential Access 的容器中,显然用 get(index) 的方法比直接用 Iterator 要慢很多。显然前者的时间复杂度是 $O(n^2)$的。
- 上一篇 SQLZoo 题目参考代码
- 下一篇 Java 中重写方法时的调用次序