Java 为什么此代码给出ConcurrentModificationException

Java 为什么此代码给出ConcurrentModificationException,java,Java,我想知道为什么会出现这种例外。在这种情况下,这种例外似乎是不公平的。在对集合或映射进行迭代时,不允许修改该集合或映射(迭代器.remove()方法除外),因为不清楚修改会如何影响迭代。而是将要添加的键和值存储在单独的映射中,然后在循环后使用 示例1:放置条目 Exception in thread "main" java.util.ConcurrentModificationException at java.util.HashMap$HashIterator.nextEntry(Unkn

我想知道为什么会出现这种例外。在这种情况下,这种例外似乎是不公平的。

在对集合或映射进行迭代时,不允许修改该集合或映射(迭代器.remove()方法除外),因为不清楚修改会如何影响迭代。而是将要添加的键和值存储在单独的映射中,然后在循环后使用


示例1:放置条目

Exception in thread "main" java.util.ConcurrentModificationException
  at java.util.HashMap$HashIterator.nextEntry(Unknown Source)
  at java.util.HashMap$KeyIterator.next(Unknown Source)
  at ConcurrentHashMapTest.main(ConcurrentHashMapTest.java:21)
Map<String, String> map = /* ... */;
Map<String, String> mapToPut = new HashMap<>();
Iterator<String> iterator = map.keySet().iterator();
while (iterator.hasNext()) {
  String key = iterator.next();
  if (key.equals("Test")) {
    mapToPut.put("New key for " + key, "new value");
  }
}
map.putAll(mapToPut);
Map=/*…*/;
Map mapToPut=new HashMap();
迭代器迭代器=map.keySet().Iterator();
while(iterator.hasNext()){
String key=iterator.next();
if(键等于(“测试”)){
mapToPut.put(“新键为”+键,新值”);
}
}
map.putAll(mapToPut);
示例2:删除条目

Exception in thread "main" java.util.ConcurrentModificationException
  at java.util.HashMap$HashIterator.nextEntry(Unknown Source)
  at java.util.HashMap$KeyIterator.next(Unknown Source)
  at ConcurrentHashMapTest.main(ConcurrentHashMapTest.java:21)
Map<String, String> map = /* ... */;
Map<String, String> mapToPut = new HashMap<>();
Iterator<String> iterator = map.keySet().iterator();
while (iterator.hasNext()) {
  String key = iterator.next();
  if (key.equals("Test")) {
    mapToPut.put("New key for " + key, "new value");
  }
}
map.putAll(mapToPut);
Map=/*…*/;
迭代器迭代器=map.keySet().Iterator();
while(iterator.hasNext()){
String key=iterator.next();
if(键等于(“测试”)){
iterator.remove();
}
}

在对集合或映射进行迭代时,不允许修改它(除了
迭代器.remove()
方法),因为不清楚修改会如何影响迭代。而是将要添加的键和值存储在单独的映射中,然后在循环后使用


示例1:放置条目

Exception in thread "main" java.util.ConcurrentModificationException
  at java.util.HashMap$HashIterator.nextEntry(Unknown Source)
  at java.util.HashMap$KeyIterator.next(Unknown Source)
  at ConcurrentHashMapTest.main(ConcurrentHashMapTest.java:21)
Map<String, String> map = /* ... */;
Map<String, String> mapToPut = new HashMap<>();
Iterator<String> iterator = map.keySet().iterator();
while (iterator.hasNext()) {
  String key = iterator.next();
  if (key.equals("Test")) {
    mapToPut.put("New key for " + key, "new value");
  }
}
map.putAll(mapToPut);
Map=/*…*/;
Map mapToPut=new HashMap();
迭代器迭代器=map.keySet().Iterator();
while(iterator.hasNext()){
String key=iterator.next();
if(键等于(“测试”)){
mapToPut.put(“新键为”+键,新值”);
}
}
map.putAll(mapToPut);
示例2:删除条目

Exception in thread "main" java.util.ConcurrentModificationException
  at java.util.HashMap$HashIterator.nextEntry(Unknown Source)
  at java.util.HashMap$KeyIterator.next(Unknown Source)
  at ConcurrentHashMapTest.main(ConcurrentHashMapTest.java:21)
Map<String, String> map = /* ... */;
Map<String, String> mapToPut = new HashMap<>();
Iterator<String> iterator = map.keySet().iterator();
while (iterator.hasNext()) {
  String key = iterator.next();
  if (key.equals("Test")) {
    mapToPut.put("New key for " + key, "new value");
  }
}
map.putAll(mapToPut);
Map=/*…*/;
迭代器迭代器=map.keySet().Iterator();
while(iterator.hasNext()){
String key=iterator.next();
if(键等于(“测试”)){
iterator.remove();
}
}

ConcurrentModificationException是因为您在迭代集合时正在修改集合

您可以按如下方式更改逻辑以避免它

Map<String, String> map = /* ... */;
Iterator<String> iterator = map.keySet().iterator();
while (iterator.hasNext()) {
  String key = iterator.next();
  if (key.equals("Test")) {
    iterator.remove();
  }
}
Map hMap=newhashmap();
hMap.put(“第一”、“1”);
hMap.put(“第二”、“2”);
hMap.put(“第三”、“3”);
hMap.put(“第四”、“第四”);
hMap.put(“第五”、“第五”);
hMap.put(“第六”、“第六”);
System.out.println(“迭代前的HashMap:+hMap”);
迭代器hashMapIterator=hMap.keySet().Iterator();
布尔值为四分之一=假;
while(hashMapIterator.hasNext()){
String key=hashMapIterator.next();
if(键等于(“第四”)){
isFourth=真;
}
} 
如果(第四)
hMap.put(“第四个”+“-希瓦姆”,“我是hMap中的新键”);
System.out.println(“迭代后的HashMap:+hMap”);

ConcurrentModificationException是因为您在迭代集合时正在修改集合

您可以按如下方式更改逻辑以避免它

Map<String, String> map = /* ... */;
Iterator<String> iterator = map.keySet().iterator();
while (iterator.hasNext()) {
  String key = iterator.next();
  if (key.equals("Test")) {
    iterator.remove();
  }
}
Map hMap=newhashmap();
hMap.put(“第一”、“1”);
hMap.put(“第二”、“2”);
hMap.put(“第三”、“3”);
hMap.put(“第四”、“第四”);
hMap.put(“第五”、“第五”);
hMap.put(“第六”、“第六”);
System.out.println(“迭代前的HashMap:+hMap”);
迭代器hashMapIterator=hMap.keySet().Iterator();
布尔值为四分之一=假;
while(hashMapIterator.hasNext()){
String key=hashMapIterator.next();
if(键等于(“第四”)){
isFourth=真;
}
} 
如果(第四)
hMap.put(“第四个”+“-希瓦姆”,“我是hMap中的新键”);
System.out.println(“迭代后的HashMap:+hMap”);

在遍历地图元素的同时修改地图。此外,由于您使用的是
映射
,因此如果hMap.containsKey(“第四”){/*code*/},您只需使用
。您在遍历映射元素的同时修改映射。另外,由于您使用的是
映射
,如果hMap.containsKey(“第四”){/*code*/}
,您可以使用
。同意!!!但是它在文档中吗???是的。例如,类文档中说:*…如果在创建迭代器后的任何时候,以迭代器自己的remove方法以外的任何方式对映射进行结构修改,迭代器将抛出“ConcurrentModificationException”。“轻微更正,实际上,您可以在迭代集合时对其进行修改—但必须使用迭代器进行修改—例如,如果迭代器支持
remove()
,则可以在迭代时删除元素。ConcurrentModificationException仅在您尝试修改集合时发生,而不是使用用于迭代集合的迭代器。@alfasin谢谢,您是对的。我可以获取上述stmt的一段代码吗..如果可能的话,请参见!!!但是它在文档中吗???是的。例如,类文档中说:*…如果在创建迭代器后的任何时候,以迭代器自己的remove方法以外的任何方式对映射进行结构修改,迭代器将抛出“ConcurrentModificationException”。“轻微更正,实际上,您可以在对集合进行迭代时对其进行修改—但必须使用迭代器进行修改—例如,如果迭代器支持
remove()
,则可以删除