为什么我们需要在Java中的ArrayList上使用迭代器?

2022-09-01 04:14:47

我正在阅读提到的问题“我们是否需要在ArrayList上使用迭代器?”的答案。

在答案中,用户这样说:“使用ArrayLists迭代器的一个大用例是当你想要在迭代时删除元素时”。

即使使用Java中ArrayList的删除方法也可以实现。我的问题是为什么我们需要ArrayList中的迭代器?

考虑以下代码:

import java.util.*;
public class ocajp66 {
    public static void main(String[] args) {
        ArrayList a = new ArrayList();
        for (int i = 0; i < 10; i++) {
            a.add(i);
        }
        System.out.printf("BEFORE ITERATOR\n");
        for (int i = 0; i < a.size(); i++) {
            System.out.printf("I:%d\n", a.get(i));
        }
        System.out.printf("AFTER ITERATOR\n");
        Iterator i = a.iterator();
        while (i.hasNext()) {
            System.out.printf("I:%d\n", i.next());
        }
    }
}

任何人都可以解释迭代器的重要性吗?如果你能用代码解释我,那就太好了。


答案 1

正如你所说,当你想要在迭代数组内容时删除东西时,会使用迭代器。如果您不使用迭代器,而只是有一个for循环,并且在其中使用 remove 方法,则会出现异常,因为数组的内容在您迭代时会发生变化。例如:在for循环开始时,您可能会认为数组大小为10,但一旦删除内容,情况就不会如此。因此,当您到达最后一个循环时,可能会有IndexOutofBoundsException等。


答案 2

很明显,类似-的API可以在没有该方法的情况下工作。但是,an 是 a,并且该方法在接口中定义...所以必须实现它。ArrayListiterator()ArrayListCollectioniterator()CollectionArrayList

关于从 中删除的要点是,通过索引来执行此操作需要一些思考:ArrayList

    for (int i = 0; 
         i < a.size(); // Hoist this at your peril
         i++) {
        if (a.get(i) == something) {
            a.remove(i);
            i--;  // Leave this out at your peril
        }
    }

如果你需要从循环调用的方法中删除list元素,情况会变得更糟......因为该方法必须说它已经删除了一个元素,以便调用方可以调整循环索引。

第三个原因是它允许您使用Java 5的语法。iteratorArrayListfor (type var : iterable) ...

最重要的是,您不必实例上使用迭代器。如果你不想,那就不要。ArrayList