代码
public static void main(String[] args) {
test test = new test();
test.bugTwo();
}
private void bugTwo() {
List<Map<String, Object>> list = new ArrayList<>();
HashMap<String, Object> map = new HashMap<>();
map.put("1", "1");
map.put("2", "2");
map.put("3", "3");
map.put("4", "4");
list.add(map);
System.out.println(list);
for (Map<String, Object> demo : list) {
for (int i = 0; i < 2; i++) {
Map<String, Object> iMap = new HashMap<>();
iMap.put("1", "11" + i);
iMap.put("2", "22" + i);
iMap.put("3", "33" + i);
iMap.put("4", "44" + i);
list.add(map);
}
}
System.out.println(list);
}
结果
原因
ConcurrentModificationException 是 Java 中的一个异常类型,属于 java.util.ConcurrentModificationException 类。它是一种运行时异常(RuntimeException)。
这个异常通常发生在多线程或者非线程安全的上下文中,当一个集合(比如 ArrayList、LinkedList、HashSet 等)正在进行迭代(遍历)时,有另一个线程或操作修改了这个集合的结构(如添加、删除或替换元素)。
1、当在使用迭代器(Iterator)或增强型 for 循环遍历集合时,同时尝试修改集合(除了使用 Iterator 的 remove() 方法外),会导致 ConcurrentModificationException。
2、在多线程环境下,如果一个线程正在遍历集合,而另一个线程修改了这个集合,同样会触发 ConcurrentModificationException。
解决
创建一个新的 List 进行添加元素
public static void main(String[] args) {
test test = new test();
test.bugTwo();
}
private void bugTwo() {
List<Map<String, Object>> list = new ArrayList<>();
HashMap<String, Object> map = new HashMap<>();
map.put("1", "1");
map.put("2", "2");
map.put("3", "3");
map.put("4", "4");
list.add(map);
System.out.println(list);
// for (Map<String, Object> demo : list) {
//
// for (int i = 0; i < 2; i++) {
// Map<String, Object> iMap = new HashMap<>();
// iMap.put("1", "11" + i);
// iMap.put("2", "22" + i);
// iMap.put("3", "33" + i);
// iMap.put("4", "44" + i);
// list.add(map);
// }
//
// }
List<Map<String, Object>> listCopy = new ArrayList<>();
for (Map<String, Object> demo : list) {
listCopy.add(demo);
for (int i = 0; i < 2; i++) {
Map<String, Object> iMap = new HashMap<>();
iMap.put("1", "11" + i);
iMap.put("2", "22" + i);
iMap.put("3", "33" + i);
iMap.put("4", "44" + i);
listCopy.add(iMap);
}
}
list.clear();
list.addAll(listCopy);
System.out.println(list);
}