加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

更新Java HashMap键

发布时间:2020-12-14 05:04:15 所属栏目:Java 来源:网络整理
导读:我只是想知道,如果HashMap的关键字是可变的,那么会发生什么,下面的测试程序会演示,当我们都等于和hashCode方法返回时,我无法理解 true和相同的值,为什么hashmap.containsKey返回false. public class MutableKeyHashMap { public static void main(String []a
我只是想知道,如果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;
    }
}

这个输出:

true
false 6 6 true

解决方法

javadoc解释了

Note: great care must be exercised if mutable objects are used as map keys. The behavior of a map is not specified if the value of an object is changed in a manner that affects equals comparisons while the object is a key in the map.

基本上,不要在地图中使用可变对象作为键,你将被烧毁

要推断,因为文档可能不清楚,我相信这里的相关点是以影响equals的方式进行更改,而且您似乎假设每次调用包含的equals(Object)时都会调用该对象.文档没有说,这个措辞意味着它们可能被允许缓存计算.

看看source,似乎是因为你的hashCode返回一个不同的值(现在是5,现在是6),它可能是根据实现细节在不同的桶中查找的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读