HashSet<String> set = new HashSet<String>();
set.add("test1");
Iterator<String> it = set.iterator();
while(it.hasNext()){
it.next();
set.add("sf");
it.remove();
}
抛出异常:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.remove(Unknown Source)
如果我删除了set.add("sf");
,它显然有效。
但是为什么我不能在使用迭代器时向HashSet添加内容?
答案 0 :(得分:1)
Iterator在迭代时不支持添加。在集合迭代器中使用expectedModCount来检查它是否被其他人修改。当你使用set reference modCount值进行一些add时,并且expectModCount没有改变导致异常。
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
public interface Iterator {
boolean hasNext();
E next();
void remove();
}
答案 1 :(得分:0)
不,Iterator
接口不支持在迭代期间向Collection
添加元素。
如果您使用List
代替Set
,则可以使用支持在迭代期间添加元素的ListIterator
。
这是在Iterator
的{{1}}方法的Javadoc中指定的:
如果在迭代进行过程中以除了调用此方法之外的任何方式修改基础集合,则未指定迭代器的行为。
remove()
对任意add()
无法支持Iterator
的原因是您正在使用的某些集合(例如Collection
)没有订购他们的元素。迭代HashSet
时添加的元素可以在HashSet
的当前位置之前或之后添加(取决于其Iterator
),因此添加元素后迭代器的行为将是不可预测的。