当前位置: 首页 > 面试题库 >

更新Java HashMap密钥

贺彬
2023-03-14
问题内容

我只是想知道,如果一个键会发生什么HashMap是可变的,测试程序如下证明,我无法理解当两个平等和hashCode方法返回true和值相同,为什么hashmap.containsKey回报false

public class MutableKeyHashMap {

    public static void main(String []a){

            HashMap<Mutable, String> map = new HashMap<Mutable, String>();
            Mutable m1 = new Mutable(5);
            map.put(m1, "m1");
            Mutable m2 = new Mutable(5);
            System.out.println(map.containsKey(m2));

            m2.setA(6);
            m1.setA(6);
            Mutable m3 = map.keySet().iterator().next();

            System.out.println(map.containsKey(m2)+"    "+m3.hashCode()+"       "+m2.hashCode()+"       "+m3.equals(m2));

    }
}
class Mutable {

    int a;

    public Mutable(int a) {

        this.a = a;
    }

    @Override
    public boolean equals(Object obj) {

        Mutable m = (Mutable) obj;
        return m.a == this.a ? true : false; 
    }

    @Override
    public int hashCode(){
        return a;
    }

    public void setA(int a) {

        this.a = a;
    }

    public int getA() {
        return a;
    }
}

这个输出:

是否6 6是


问题答案:

该javadoc的解释它

注意:如果将可变对象用作地图键,则必须格外小心。如果在对象是映射中的键的情况下以影响等值比较的方式更改对象的值,则不会指定映射的行为。

基本上,不要在地图中使用可变对象作为键,否则会被烧死

推断一下,因为文档可能看起来不清楚,所以我认为这里的相关要点“以影响equals的方式发生了变化”,并且您似乎假设每次调用contains时都会调用equals(Object)。文档并没有说,措辞暗示他们可能被允许缓存计算。

查看源代码,似乎是因为您的hashCode返回了一个不同的值(以前是5,现在是6),所以有可能根据实现细节在另一个存储桶中查找它。



 类似资料:
  • 在Azure Portal>Key vaults>Secrets,我有json值的秘密(不是我创建的)。类似于: null 谢谢

  • 问题内容: 在SQLAlchemy中有一种优雅的方法吗?我的意思是语法类似于? 问题答案: 现在,仅在MySQL的SQLAlchemy中内置了此功能。somada141的以下答案是最佳解决方案:https ://stackoverflow.com/a/48373874/319066 在SQL语句中 如果希望生成的SQL实际上包含,则最简单的方法涉及使用装饰器。 的代码(来自关于该主题的很好的螺纹连

  • 不出所料,我不再能够将本地提交推送到BitBucket上的存储库(的身份验证失败),但我忘记了如何更新iMac上的缓存密码。不知何故,我在谷歌或Stack ;Overflow上找不到它,尽管在我看来它应该相当简单...

  • 是否有任何可能的方法,我可以更新AWS秘密管理器中的密钥/值,而不必检索当前值,然后更新它们? 我找到的当前解决方案首先从secrets Manager中检索值: 但我不想检索秘密值。首选语言是Python。

  • 如何使用选项编写原则查询?

  • 是否有一种方法可以在不更改秘密标识符的情况下更改密钥库的秘密值?我在azure portal中尝试了new version按钮,但秘密标识符改变了。 谢了,亚当。