H5W3
当前位置:H5W3 > 其他技术问题 > 正文

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

回答:

因为你在遍历 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时,删除元素.

本文地址:H5W3 » hashMap反转<value,key>为什么报错

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址