您的位置首页百科知识

解决ConcurrentModificationException异常问题

解决ConcurrentModificationException异常问题

的有关信息介绍如下:

解决ConcurrentModificationException异常问题

在遍历Map时删除指定元素,会抛java.util.ConcurrentModificationException

使用Iterator的Remove方法可解决此问题

会报java.util.ConcurrentModificationException的代码

private static void fastFailSceneWhenRemove(Map source) {

for (Map.Entry entry : source.entrySet()) {

if (entry.getKey().contains("1")) {

source.remove(entry.getKey());

}

}

System.out.println(source);

}

使用Iterator的Remove方法,可以解决此问题。

可以正常运行的代码:private static void commonSceneWhenRemove(Map source) {

Iterator> iterator = source.entrySet().iterator();

while (iterator.hasNext()) {

Map.Entry entry = iterator.next();

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 = new HashMap(); for (int i = 0; i < 10; i++) {

source.put("key" + i, "value" + i);

}

System.out.println("Source:" + source);

// fastFailSceneWhenRemove(source);

commonSceneWhenRemove(source);

}

private static void commonSceneWhenRemove(Map source) {

Iterator> iterator = source.entrySet().iterator();

while (iterator.hasNext()) {

Map.Entry entry = iterator.next();

if (entry.getKey().contains("1")) {

iterator.remove();

}

}

System.out.println(source);

}

private static void fastFailSceneWhenRemove(Map source) {

for (Map.Entry entry : source.entrySet()) {

if (entry.getKey().contains("1")) {

source.remove(entry.getKey());

}

}

System.out.println(source);

}

}