我浏览了Iterator.remove() remove(的文档( remove(),描述为
void remove()从基础集合中移除迭代器返回的最后一个元素(可选操作)。此方法只能在每次调用next时调用一次。如果基础集合在迭代过程中被修改,则迭代器的行为将不指定,除非调用此方法。
因此,任何人都能看出“可选”是什么意思吗? operations.)
中“修改”意味着什么?
如果基础集合被修改为
,则未指定迭代器的
行为。
发布于 2009-10-08 08:08:36
#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();发布于 2009-10-08 08:08:59
首先,java.util.Iterator是一个接口,即实现该接口的类如何与世界其他地方交互的协议。他们的责任是如何实施interaface的方法。
如果底层数据结构不允许删除,那么remove()将抛出一个UnsupportedOperationException。例如,如果您正在迭代从DB检索的结果集,则不实现此方法是有意义的。
如果您在并发线程之间共享的某个集合上迭代,而另一个线程修改数据迭代线程,那么将返回不确定的结果。
发布于 2009-10-08 08:08:40
它被描述为可选的,因为并不是所有可以为您提供迭代器的集合类都在它们返回的迭代器中实现了remove()方法。如果返回的迭代器没有实现它,将抛出一个UnsupportedOperationException。
普通的java.util.ArrayList、java.util.LinkedList和其他标准集合类都在它们的迭代器中实现了remove()方法,因此您可以安全地使用它。
https://stackoverflow.com/questions/1536273
复制相似问题