根据太阳的说法,
"Iterator.remove是在迭代期间修改集合的唯一安全方法;如果在迭代过程中以任何其他方式修改基础集合,则未指定行为。“
我有两个问题:
发布于 2013-01-07 17:02:46
如果您正在迭代一个集合并使用:
Collection.remove() 您可以获得运行时错误(特别是ConcurrentModifcationException),因为您正在更改以前用于构造完成循环所需的一系列显式调用的对象的状态。
如果你使用:
Iterator.remove()您告诉运行时,您希望更改基础集合,并重新评估完成循环所需的显式调用系列。
发布于 2013-01-07 17:00:19
首先,Collection.remove()非常有用。它适用于许多用例,可能比Iterator.remove()更适用。
但是,后者解决了一个特定的问题:它允许您在迭代集合时修改集合。
Iterator.remove()解决的问题如下所示:
List<Integer> l = new ArrayList<Integer>(Arrays.asList(1, 2, 3, 4));
for (int el : l) {
if (el < 3) {
l.remove(el);
}
}此代码无效,因为l.remove()是在l迭代期间调用的。
以下是正确的编写方法:
Iterator<Integer> it = l.iterator();
while (it.hasNext()) {
int el = it.next();
if (el < 3) {
it.remove();
}
}发布于 2013-01-07 16:59:38
正如你引用的文件所明确指出的,
Iterator.remove是在迭代期间修改集合的唯一安全方法。
(强调后加)
在使用am迭代器时,除非调用Iterator.remove(),否则不能修改集合。
如果不迭代集合,则使用Collection.remove()。
https://stackoverflow.com/questions/14200489
复制相似问题