Java 在迭代hashmap时,我没有得到ConcurrentModification异常

Java 在迭代hashmap时,我没有得到ConcurrentModification异常,java,Java,值对到Hashmap中。在迭代该映射时,我在没有得到异常的时候又插入了一个键值对。当并发修改出现异常时,有人能帮我吗 霉菌代码: public static void main(String[] args) { Map<String, String> hMap = new HashMap<String, String>(); hMap.put("FIRST", "1"); hMap.put("SECOND", "2");

值对到Hashmap中。在迭代该映射时,我在没有得到异常的时候又插入了一个键值对。当并发修改出现异常时,有人能帮我吗

霉菌代码:

public static void main(String[] args) {
        Map<String, String> hMap = new HashMap<String, String>();
        hMap.put("FIRST", "1");
        hMap.put("SECOND", "2");
        hMap.put("THIRD", "3");
        hMap.put("FOURTH", "4");
        hMap.put("FIFTH", "5");
        hMap.put("SIXTH", "6");
        System.out.println("HashMap before iteration : " + hMap);
        Iterator<String> hashMapIterator = hMap.keySet().iterator();
        while (hashMapIterator.hasNext()) {
            String key = hashMapIterator.next();
            if (key.equals("FOURTH")) {
                System.out.println("key = " + key);
                hMap.put("sfsfsfsf2", "dsgfdsg");
            }
        }
        System.out.println("HashMap after iteration : " + hMap);
    }
publicstaticvoidmain(字符串[]args){
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(键等于(“第四”)){
System.out.println(“key=“+key”);
hMap.put(“SF2”、“dsgfdsg”);
}
}
System.out.println(“迭代后的HashMap:+hMap”);
}

发生
并发修改异常
,因为
迭代器
映射#put
可以同时修改
映射
。要避免这种情况,请为
#put
操作创建临时存储:

Map<String, String> tmp = new HashMap<String, String>();
//...
Iterator<String> iter = hMap.keySet().iterator();
while(iter.hasNext()) {
    //...
    tmp.put("asdfasdf", "aasdfasdfas");
}
for (Entry<String, String> ops : tmp.entrySet())
    hMap.put(ops.getKey(), ops.getValue());
Map tmp=newhashmap();
//...
迭代器iter=hMap.keySet().Iterator();
while(iter.hasNext()){
//...
tmp.put(“asdfasdf”、“aasdfasdfas”);
}
对于(条目ops:tmp.entrySet())
put(ops.getKey(),ops.getValue());
一个简单的观察:如果
#put
在迭代时添加了一个新的键,那么迭代器如何知道它必须在新的迭代序列中“跳回”才能获得新添加的键呢

其他地图 我的猜测是,如果将来自
#put
键添加到
入口集
中,使其位置(在
迭代器
中)位于当前迭代的元素之后,那么
ConcurrentModificationException
可能不会发生,因此“旧的”
迭代器
仍然与“新的”一致
entrySet
,因为它以“新的”
迭代器所具有的相同顺序交付元素。但这只是我的猜测,为什么它可能不会发生。但是,这样的编码确实很糟糕,因为现有代码将取决于
key
-类的
hashCode
的实现细节

哈希图
HashMap
的函数跟踪对
Map
的结构修改:

此HashMap在结构上被修改的次数结构修改是指更改HashMap中映射的数量或以其他方式修改其内部结构(例如,重新设置)的次数。此字段用于使HashMap集合视图上的迭代器快速失败。(参见ConcurrentModificationException)


当请求
HashIterator
前进时,它会检查
modCount
自创建以来是否已更改。如果有,它会抛出一个
ConcurrentModificationException
。这意味着,如果您只更改与键关联的值,但不以任何方式更改键,则不会抛出该异常。

可能会获得
ConcurrentModificationException
,但没有保证。键集的
Map
(和
HashMap
)为:

如果在集合上进行迭代时修改映射 (除了通过迭代器自己的删除操作之外),的结果 迭代未定义

一些实现尝试快速失败,但同样没有保证。
Hashmap
javadoc甚至说:

请注意,不能保证迭代器的快速失败行为 一般来说,不可能作出任何硬性保证 在存在非同步并发修改的情况下。快速失败 迭代器尽最大努力抛出ConcurrentModificationException 基础。因此,编写依赖于 关于这个例外的正确性


您不能保证获得ConcurrentModificationException。您可能会得到一个,或者它可能会工作,或者它可能会给您错误的结果。您是否尝试在迭代地图时修改它?这从来都不是一个好主意,而是尝试在迭代后修改映射,或者在修改列表后中断迭代……如果您想要CME(只有上帝知道为什么),请删除
if(key.equals(“第四”)
再试一次。如果我删除,你的代码就会抛出ConcurrentModificationException@Ninad Pingale ya k。但是如果我当时保留if(key.equals(“一”),我也会得到异常。如果我当时保留if(key.equals(“第四”),我不会得到异常,你能告诉我为什么吗?问题是他“没有”获取ConcurrentModificationException;)@SyamS我真的不太懂OP的英语,但如果是这样,他的JRE被严重窃听。仅供参考
HashMap
是一个快速失败的实现,请参阅其内部
modCount