我们是否需要在ArrayList上使用迭代器?

Vit*_*aly 12 java

昨天,当我在回答问题时使用迭代器和删除时收到ConcurrentModificationException错误我添加了一个通知,

当你有ArrayLists时,使用迭代器不是一个好主意.

你不需要深刻理解那个问题来回答这个问题.

在那里,我得到两条评论,我错了.

我的论点:

  1. 迭代器的代码可读性差得多.

  2. 有可能引发难以调试的ConcurrentModificationException.

你能解释一下吗?

问题:我们是否需要在ArrayList上使用迭代器?

UPD

这是关于显式使用Iterator.

Den*_*ret 22

使用ArrayLists的迭代器的一个大用例是当你想在迭代时删除元素.您只有三个安全的解决方案:

  • 使用迭代器及其remove方法
  • 将要保留的元素复制到另一个列表中
  • 丛林与索引

假设你没有add迭代,使用迭代器是一个避免的方法ConcurrentModificationException.

可读性论证是主观的.就个人而言,我发现一个干净的声明迭代器不太可读.并且它并不重要,因为迭代器是同时迭代和删除的安全方式.


Dav*_*vid 11

似乎没有任何答案可以解释迭代器的原因.创建迭代器设计模式是因为对象应该控制它自己的状态(除了可能只有公共属性的值对象).

假设我们有一个包含数组的对象,并且该对象中有一个接口可以向该数组添加项.但你做了这样的事情:

class MyClass
{
    private ArrayList<Item> myList;

    public MyClass()
    {
        myList = new ArrayList();
    }

    public addItem( Item item )
    {
         item.doSomething(); // Lets say that this is very important before adding the item to the array.
         myList.add( item );
    }
}
Run Code Online (Sandbox Code Playgroud)

现在如果我在上面的课程中有这个方法:

public ArrayList getList()
{
    return myList;
}
Run Code Online (Sandbox Code Playgroud)

有人可以通过这个方法获取对myList的引用,并将项添加到数组中,而无需调用item.doSomething(); 这就是为什么你不应该返回对数组的引用,而是返回它的迭代器.可以从数组中获取任何项目,但它无法操纵原始数组.所以MyClass对象仍然控制着它自己的状态.

这就是发明迭代器的真正原因.