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

时间:2009-10-08 07:57:47

标签: java iterator

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

void remove()
  

从底层集合中删除返回的最后一个元素   通过迭代器(可选操作)。   此方法只能调用一次   每次打电话给下一个。一个人的行为   如果是,则未指定迭代器   底层集合已修改   而迭代正在进行中   通过调用此方式以外的任何方式   方法

  1. 任何人都可以告诉“可选”是什么意思。
  2. 这是否会影响操作的稳健性?(与c ++一样,它不能保证操作的稳健性。)
  3. 为什么在此明确指定“可选”。
  4. 第二行文档中“修改”的含义
  5.   如果修改了基础集合,则未指定迭代器的

    行为

3 个答案:

答案 0 :(得分: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();
  ...
}

如果您现在想要在列表中迭代时删除项目,则可以调用

c.remove("Item 2");

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

i.remove();

答案 1 :(得分:6)

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

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

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

答案 2 :(得分:2)

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

普通java.util.ArrayListjava.util.LinkedList和其他标准集合类都在其迭代器中实现remove()方法,因此您可以安全地使用它。