为什么iterator.remove()被描述为可选操作?
我浏览了Iterator.remove()
的文档( http://java.sun.com/javase/6/docs/api/java/util/Iterator.html ),其中remove(
)被描述为
void remove()
从底层集合中移除迭代器返回的最后一个元素(可选操作)。 每次调用next时,只能调用一次此方法。 如果在迭代正在进行中以除调用此方法之外的任何方式修改基础集合,则未指定迭代器的行为。
- 所以任何人都可以告诉“可选”是什么意思。
- 这是否会影响操作的稳健性?(与c ++一样,它不能保证操作的稳健性。)
- 为什么在这里明确指定了“可选”。
- “修改”在第二行文档中意味着什么
如果修改了基础集合,则未指定迭代器的行为
#1:可选意味着您可以实现它或抛出UnsupportedOperationException
#2:此操作是可选的,因为有时您不希望修改迭代器的内容。 或者你对“操作的稳健性”有什么理解?
编辑 #4: behavior of an iterator is unspecified if the underlying collection is modified
通常,您通过执行使用迭代器
List c = new ArrayList (); c.add("Item 1"); c.add("Item 2"); c.add("Item 3"); ... for (Iterator i = c.iterator(); i.hasNext();) { String s = i.next(); ... }
如果你现在想在迭代列表时删除一个项目,你会打电话
c.remove("Item 2");
这不干净 ,可能会破坏 List / Collection /中的数据 ,应该避免 。 相反, 通过迭代器删除()项目:
i.remove();
首先, java.util.Iterator
是一个接口,即实现此接口的类如何与世界其他地方交互的协议。 他们如何实施互动方法是他们的责任。
如果底层数据结构不允许删除,则remove()
将抛出UnsupportedOperationException
。 例如,如果要迭代从DB检索的结果集,那么实现此方法就没有意义。
如果迭代一些在并发线程之间共享的集合,而另一个线程修改数据迭代线程,那么将返回不确定的结果。
它被描述为可选的,因为并非所有可以为您提供迭代器的集合类都会在它们返回的迭代器中实现remove()
方法。 如果返回的迭代器未实现它,则将抛出UnsupportedOperationException
。
普通的java.util.ArrayList
, java.util.LinkedList
和其他标准集合类都在它们的迭代器中实现了remove()
方法,因此您可以安全地使用它。