在遍历Map时删除指定元素,会抛java.util.ConcurrentModificationException
使用Iterator的Remove方法可解决此问题
前期准备工作(包括相关工具或所使用的原料等)IntelliJ java 详细的操作方法或具体步骤
会报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);
}
}
经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域),建议您详细咨询相关领域专业人士。作者声明:本教程系本人依照真实经历原创,未经许可,谢绝转载。- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
