hashcode与HashMap

hashcode是对象在hash表中对应的位置.
而hash可能会发生hash冲突,所以可能存在不同对象hashcode是相同的.

class Solution {
    public static void main(String[] args) {
        Integer a = 223;
        Integer b = 223;
        System.out.println(a == b);
        System.out.println(a.hashCode() == b.hashCode());
    }
}

上述代码,因为a与b不在Integer常量池的范围[–128,127]之间它俩必然不相等.
但是第二个输出是true.
我一开始很迷惑,后来想到了equals与hashcode 的关系,就明白所有的包装类都重写了Object的hashcode方法,你如果看源码,就会发现

 public static int hashCode(int value) {
        return value;
    }

直接返回了它的值.
这样就保证了equals与hashcode的关系.

但是查看util中的常用的类,发现PriorityQueue并没有重写hashcode.
我们考虑PriorityQueue的底层是通过数组存储的,只是在进出数组的时候,通过算法保证了堆的性质.相当于直接存数组.

下列代码的结果是2

class Solution {
    public static void main(String[] args) {
        HashMap<PriorityQueue<Integer>, Integer> map = new HashMap<>();
        PriorityQueue<Integer> q = new PriorityQueue<>();
        q.add(12);
        map.put(q, 1);

        PriorityQueue<Integer> q1 = new PriorityQueue<>();
        q1.add(12);
        map.put(q1, 1);

        System.out.println(map.size());
    }
}

数组是语言特性,没有覆盖Object的equals与hashcode方法.
所以HashMap以数组为key可能会导致代码与逻辑不符.如果确实需要使用数组中的值作为key,可以转化成List作为HashMap的key,因为AbstractList重写了hashcode.

另外自定义的类,最好自己根据逻辑重写hashcode和equals,以防止使用HashMap,HashSet时出错.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当你使用HashMap时,重写hashCode()方法是非常重要的。HashMap使用hashCode()方法来计算键的散列码,以确定在哈希表中的存储位置。如果hashCode()方法没有被正确地重写,可能会导致键在哈希表中产生冲突,这会影响HashMap的性能和可靠性。 重写hashCode()方法的准则如下: 1. 如果两个对象通过equals()方法比较相等,那么它们的hashCode()方法必须返回相同的值。也就是说,如果两个对象相等,则它们的散列码必须相等。 2. 如果两个对象通过equals()方法比较不相等,那么它们的hashCode()方法应该返回不同的值。也就是说,不相等的对象应该有不同的散列码。 以下是一个示例,展示了如何重写hashCode()方法: ```java public class MyClass { private int id; private String name; // 构造函数、getter和setter方法省略 @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + id; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null || getClass() != obj.getClass()) return false; MyClass other = (MyClass) obj; return id == other.id && Objects.equals(name, other.name); } } ``` 在上面的示例中,我们使用id和name属性来计算hashCode()值,并在equals()方法中比较它们是否相等。这样做可以确保当两个对象的id和name属性相同时,它们的hashCode()值也相同。 请注意,为了保证hashCode()方法的正确性,必须遵循以上两个准则,同时还需要重写equals()方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值