【问题标题】:why iterator.remove() has been described as optional operation?为什么 iterator.remove() 被描述为可选操作?
【发布时间】:2010-12-04 21:50:00
【问题描述】:

我浏览了Iterator.remove() 的文档(http://java.sun.com/javase/6/docs/api/java/util/Iterator.html) remove() 被描述为

void remove()

从底层集合中移除返回的最后一个元素 由迭代器(可选操作)。 该方法只能调用一次 每次调用下一个。一个人的行为 迭代器未指定,如果 基础集合被修改 当迭代正在进行时 除了调用这个以外的任何方式 方法。

  1. 那么任何人都可以说出“可选”是什么意思吗?
  2. 这会影响操作的健壮性吗?(和c++一样,它不保证操作的健壮性。)
  3. 为什么在这里明确指定了“可选”。
  4. 文档第二行中的“修改”是什么意思

如果底层集合被修改,迭代器的行为是未指定的

【问题讨论】:

    标签: java iterator


    【解决方案1】:

    #1:可选意味着您可以实现它抛出UnsupportedOperationException

    #2:此操作是可选的,因为有时您只是不想修改迭代器的内容。或者您对“操作的鲁棒性”的理解是什么?

    编辑 #4:behavior of an iterator is unspecified if the underlying collection is modified

    通常,您通过执行来使用迭代器

    List<String> c = new ArrayList<String>();
    c.add("Item 1");
    c.add("Item 2");
    c.add("Item 3");
    ...
    for (Iterator<String> i = c.iterator(); i.hasNext();)
    {
      String s = i.next();
      ...
    }
    

    如果您现在想要在遍历列表时删除一个项目,您可以调用

    c.remove("Item 2");
    

    不干净,可能损坏列表/集合/...中的数据,应该避免。相反,通过迭代器删除()项目:

    i.remove();
    

    【讨论】:

    • @Atmocreation:thanx 的解释,你能描述一下第 4 个问题吗?
    【解决方案2】:

    首先java.util.Iterator 是一个接口,即实现该接口的类如何与世界其他地方交互的协议。如何实现接口的方法是他们的责任。

    如果底层数据结构不允许删除,那么remove() 将抛出UnsupportedOperationException。例如,如果您正在遍历从数据库中检索的结果集,则不实现此方法是有意义的。

    如果您迭代某个在并发线程之间共享的集合,并且另一个线程修改了数据迭代线程,那么将返回不确定的结果。

    【讨论】:

    • 但事实上每个实现方法都允许删除?
    • @Boris:thanx 解释一下。你能描述一下第 4 个问题吗?
    【解决方案3】:

    它被描述为可选的,因为并非所有可以为您提供迭代器的集合类都在它们返回的迭代器中实现remove() 方法。如果返回的迭代器没有实现它,就会抛出一个UnsupportedOperationException

    普通的java.util.ArrayListjava.util.LinkedList等标准集合类都在其迭代器中实现了remove()方法,所以可以放心使用。

    【讨论】:

    • 所以问题真的是:为什么它首先在界面中?
    • @reinierpost 我想是为了方便,因为许多实现都会实现这个方法。当您设计软件时,总是需要做出某些权衡,例如在理论上的“正确性”和实际有用性之间,复杂的设计永远不会是“完美的”。
    猜你喜欢
    • 2017-06-07
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多