我正在尝试从循环内的 ArrayList 中删除一个元素。
还行吧。
ArrayList<Integer> list = new ArrayList<Integer>(Arrays.asList(1, 2, 3));
for(Integer i: list){
if(i == 2)
list.remove(i);
}
Run Code Online (Sandbox Code Playgroud)
但这不是,并抛出concurrentMODificationException。
ArrayList<Integer> list = new ArrayList<Integer>(Arrays.asList(1, 2, 3));
for(Integer i: list){
list.remove(i);
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么。
我刚刚添加了另一个元素,它也不行(抛出 concurrentMODificationException)。
ArrayList<Integer> list = new ArrayList<Integer>(Arrays.asList(1, 2, 3, 4));
System.out.println(list);
for (Integer i : list) {
if (i == 2)
list.remove(i);
}
Run Code Online (Sandbox Code Playgroud)
使用 Iterator 类而不是 for-each 循环。
Iterator<Integer> it = list.iterator();
while (it.hasNext()) {
Integer i = it.next();
it.remove();
}
Run Code Online (Sandbox Code Playgroud)
http://docs.oracle.com/javase/7/docs/api/java/util/ConcurrentModificationException.html
例如,通常不允许一个线程修改一个集合,而另一个线程正在对其进行迭代。通常,在这些情况下迭代的结果是不确定的。如果检测到此行为,某些迭代器实现(包括 JRE 提供的所有通用集合实现的实现)可能会选择抛出此异常。这样做的迭代器被称为快速失败迭代器,因为它们快速而干净地失败,而不是冒着在未来不确定的时间出现任意、非确定性行为的风险。
请注意,此异常并不总是表示对象已被不同线程同时修改。如果单个线程发出一系列违反对象约定的方法调用,则该对象可能会抛出此异常。例如,如果线程在使用快速失败迭代器迭代集合时直接修改集合,则迭代器将抛出此异常。
| 归档时间: |
|
| 查看次数: |
8289 次 |
| 最近记录: |