请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

hashmap迭代时不允许修改?

悟空老师,我测试迭代时可以修改呀

package collections.predecessor;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class Test {
    public static void main(String[] args) {
        Map<String, Integer> hashMap = new HashMap<>();
        hashMap.put("a", 123);
        System.out.println(hashMap.get("a"));

        Iterator iter = hashMap.keySet().iterator();
        while (iter.hasNext()) {
            String key = (String) iter.next();
            hashMap.put(key, 666);
            Integer value = hashMap.get(key);
            System.out.println(hashMap.get(key));
        }
    }
}

正在回答 回答被采纳积分+3

1回答

提问者 1jushi 2020-03-30 17:03:23

看了后面讲的ArrayList迭代修改报错的解释大概明白了一些原理。但是发现上面代码在迭代过程进行修改时,put已有的key没报错,put新的key会报错,关于这点不明白,因为看HashMap的put方法源码,只要调用put,就会执行++modCount,也就是说只要put,那modCount != expectedModCount,肯定会报错。

hashMap.put("a", 123)    //不报错
hashMap.put("newKey", 666)  //报错


1 回复 有任何疑惑可以回复我~
  • 悟空 #1
    你说“因为看HashMap的put方法源码,只要调用put,就会执行++modCount”
    
    并不是这样的吧?:
                if (e != null) { // existing mapping for key
                    V oldValue = e.value;
                    if (!onlyIfAbsent || oldValue == null)
                        e.value = value;
                    afterNodeAccess(e);
                    return oldValue;
                }
    回复 有任何疑惑可以回复我~ 2020-03-30 17:11:26
  • 提问者 1jushi 回复 悟空 #2
    噢是是
    回复 有任何疑惑可以回复我~ 2020-03-30 22:00:13
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信