hashMap反转<value,key>为什么报错

反转hashMap的value,key

public class TestHashtable {
    public static void main(String[] args) {
        //hashMap 反转<value,key>
        HashMap<String, String> hashMap = new HashMap<>();
        hashMap.put("adc", "物理英雄");
        hashMap.put("apc", "魔法英雄");
        hashMap.put("t", "坦克");
        
        for (String key : hashMap.keySet()) {
            String value = hashMap.get(key);
            hashMap.put(value, key);
        }
        
    }
}

clipboard.png

报错了

Exception in thread "main" java.util.ConcurrentModificationException
    at java.base/java.util.HashMap$HashIterator.nextNode(HashMap.java:1493)
    at java.base/java.util.HashMap$KeyIterator.next(HashMap.java:1516)
    at com.test.TestHashtable.main(TestHashtable.java:18)

不知道原因是什么。
我以前学JS,现在初学java

阅读 5.4k
4 个回答

因为你在遍历 HashMap 的时候执行了新增操作,HashMap 是不允许的,你可以尝试用一个新的 HashMap 来存储反转后的键值对。用一个常见的名词解释是 快速失败(fail-fast),你可以了解一下。

应该是你在用hashMap的keys进行循环的过程中增加了key导致的,新建一个hashmap进行反转操作

HashMap判断这两个变量不相等会抛出这个异常
if (modCount != expectedModCount)
                throw new ConcurrentModificationException();
 使用ConcurrentHashMap
Map<String,String> map = new ConcurrentHashMap<String,String>();
        map.put("adc", "物理英雄");
        map.put("apc", "魔法英雄");
        map.put("t", "坦克");
        
        for (String key : map.keySet()) {
            String value = map.get(key);
            map.put(value, key);
        }

这种for的写法是用迭代器模式的.
也就是说要遍历的元素,在你开始循环之前就已经决定了.
当你在遍历时修改,迭代器也要对应修改,违反设计原则,所以不允许.
类似的错误有,遍历list时,删除元素.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题