为什么iterator.remove()被描述为可选操作?

Ash*_*wal 9 java iterator

我通过文档(去http://java.sun.com/javase/6/docs/api/java/util/Iterator.html)的Iterator.remove() 存在remove()被描述成

void remove()
Run Code Online (Sandbox Code Playgroud)

从底层集合中移除迭代器返回的最后一个元素(可选操作).每次调用next时,只能调用一次此方法.如果在迭代正在进行中以除调用此方法之外的任何方式修改基础集合,则未指定迭代器的行为.

  1. 那么任何人都能说出"可选"意味着什么.
  2. 这是否会影响操作的稳健性?(与c ++一样,它不能保证操作的稳健性.)
  3. 为什么在这里明确指定了"可选".
  4. "修改"在第二行文档中意味着什么

如果修改了基础集合,则未指定迭代器的行为

Atm*_*ons 13

#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();
  ...
}
Run Code Online (Sandbox Code Playgroud)

如果你现在想在迭代列表删除一个项目,你会打电话

c.remove("Item 2");
Run Code Online (Sandbox Code Playgroud)

不干净,可能会破坏 List/Collection /中的数据,应该避免.相反,通过迭代器删除()项目:

i.remove();
Run Code Online (Sandbox Code Playgroud)


Bor*_*vić 6

首先java.util.Iterator是一个接口,即协议实现此接口的类如何与世界其他地方相互作用.他们如何实施互动方法是他们的责任.

如果底层数据结构不允许删除,那么remove()将抛出一个UnsupportedOperationException.例如,如果要迭代从DB检索到的结果集,那么实现此方法就没有意义.

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