解决ConcurrentModificationException异常问题
的有关信息介绍如下:在遍历Map时删除指定元素,会抛java.util.ConcurrentModificationException
使用Iterator的Remove方法可解决此问题
会报java.util.ConcurrentModificationException的代码
private static void fastFailSceneWhenRemove(Map
for (Map.Entry
if (entry.getKey().contains("1")) {
source.remove(entry.getKey());
}
}
System.out.println(source);
}
使用Iterator的Remove方法,可以解决此问题。
可以正常运行的代码:private static void commonSceneWhenRemove(Map
Iterator
while (iterator.hasNext()) {
Map.Entry
if (entry.getKey().contains("1")) {
iterator.remove();
}
}
System.out.println(source);
}
java.util.HashMap中抛java.util.ConcurrentModificationException的两个场景
可以看到,是否抛异常是由modCount != expectedModCount来决定的
java.util.HashMap的remove方法的源代码
可以看到:
remove方法执行之后,java.util.HashMap.modCount++,
但java.util.HashMap.HashIterator.expectedModCount的值没有发生变化
java.util.HashMap.HashIterator的remove方法的源代码
可以看出:
remove方法执行之后,modCount和expectedModCount的值是相等的。
因此不会抛java.util.ConcurrentModificationException
完整的代码:
package chapter1;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/** * Created by MyWorld on 2016/3/3. */
public class FastFailResolver {
public static void main(String[] args) {
Map
source.put("key" + i, "value" + i);
}
System.out.println("Source:" + source);
// fastFailSceneWhenRemove(source);
commonSceneWhenRemove(source);
}
private static void commonSceneWhenRemove(Map
Iterator
while (iterator.hasNext()) {
Map.Entry
if (entry.getKey().contains("1")) {
iterator.remove();
}
}
System.out.println(source);
}
private static void fastFailSceneWhenRemove(Map
for (Map.Entry
if (entry.getKey().contains("1")) {
source.remove(entry.getKey());
}
}
System.out.println(source);
}
}