首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么iterator.remove()被描述为可选操作?

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

Stack Overflow用户
提问于 2009-10-08 07:57:46
回答 3查看 9.4K关注 0票数 10

我浏览了Iterator.remove() remove(的文档( remove(),描述为

代码语言:javascript
复制
void remove()

从基础集合中移除迭代器返回的最后一个元素(可选操作)。此方法只能在每次调用next时调用一次。如果基础集合在迭代过程中被修改,则迭代器的行为将不指定,除非调用此方法。

因此,任何人都能看出“可选”是什么意思吗? operations.)

  • Why

  • 会影响操作的健壮性吗?(与c++一样,这里也明确指定了“可选”)的健壮性。

  • 在第二行文档

中“修改”意味着什么?

如果基础集合被修改为

,则未指定迭代器的

行为。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-10-08 08:08:36

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

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

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

通常,通过执行

代码语言:javascript
复制
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();
  ...
}

如果您现在希望在迭代列表时删除一个项,那么您将调用

代码语言:javascript
复制
c.remove("Item 2");

这是不干净的,可能是损坏了您的列表/集合/.并且应该避免。相反,通过迭代器删除()项

代码语言:javascript
复制
i.remove();
票数 14
EN

Stack Overflow用户

发布于 2009-10-08 08:08:59

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

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

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

票数 6
EN

Stack Overflow用户

发布于 2009-10-08 08:08:40

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1536273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档