首页 新闻 会员 周边

如何让hashmap里面存储相同的键但是值不被覆盖

0
悬赏园豆:10 [待解决问题]

HashMap<String, String> map = new HashMap<>();
map.put("first", " 我是第一次插值");

    String temKey = new String("first");
    map.put(temKey, " 我是第二次插值");
    // 问题1:为何还是覆盖了相同键的值?。。。我这而键是不同的对象了啊,按理来说不应该不会覆盖了
    // 问题2:String temKey = new String("first"); 这而的 new String为何是灰色的?

    System.out.println("map集合的元素个数: " + map.size());
    map.entrySet().forEach(stringStringEntry -> {
        String key = stringStringEntry.getKey();
        String value = stringStringEntry.getValue();
        System.out.println("元素" + key + ", 其值是: " + value);
    });

结果:
map集合的元素个数: 1
元素first, 其值是: 我是第二次插值

lanto_liang的主页 lanto_liang | 初学一级 | 园豆:8
提问于:2020-12-24 23:05
< >
分享
所有回答(4)
0

问题1:"first" new String("first")引用地址不同,但作为map的键值时是使用的字符串的内容值比较,这2个是相同,所以就覆盖了。 如果按照引用地址不同比较,这样涉设计估计太隐晦了,估计使用时都错了
问题2:IDE的提示是冗余的,鼠标飘上去可以看到。 String temKey = "first" 只要这样写就够了

2012 | 园豆:21230 (高人七级) | 2020-12-25 08:01
1

字符串 虽然是对象, 但是你可以当做值类型来理解的。 相同内容的文本在程序里虽然引用不同,但是地址是同一个

Tom.汤 | 园豆:3028 (老鸟四级) | 2020-12-25 08:25
1

如果我没有记错的话,两个对象,如果A.Equals(B) == true的话,就视为是同一个哈希key。

会长 | 园豆:12401 (专家六级) | 2020-12-26 09:34
0

hashmap的put方法保存key不是直接保存的引用或原始值,
你自己debug把first传进hash(key)然后tab[i = (n - 1) & hash])这个i就是最终key了

困难户 | 园豆:168 (初学一级) | 2020-12-26 23:43
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册