哈希码的计算 (hashCode()与equals() )

本文探讨了Java中hashCode()方法的作用,它根据对象信息映射为散列值。在HashMap类中,JDK8的hashCode()通过Objects.hashCode()结合异或运算提高效率并降低哈希碰撞。同时,文章提到了hashCode()与equals()的关系,两者用于对象相等性的检查,但hashCode()可能存在碰撞,因此需要结合equals()确保判断准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


在Java世界中,所有的类都源自基类object,在object类中,有public native int hashCode(),该方法返
回一个hash值:Java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对
象的字段等)映射成一个数值,这个数值称作为散列值。
1)自主选择一个类,说明它hashCode方法的设计理念和代码核心逻辑。


类hashmap
代码:
JDK8 
        public final int hashCode() {
            return Objects.hashCode(key) ^ Objects.hashCode(value);
        }

2)  举例说明。
我尝试从一下两个方面去分析为什么在JDK8中改进了hashmap的hashcode()方法。
1.从 return Objects.hashCode(key) ^ Objects.hashCode(value)这个公式来看,hashmap的hashcode()直接调用了object类的hashCode()方法,在前面说过,这个方法是native方法,通常来说,native方法比本地方法执行的要快,同时,采用"^"异或运算,使得运行速度再次提高。
2.Objects.hashCode()方法的参数,分别是hashmap的KEY和VALUE,这使得不同的<K,V>传入进来,hash碰撞的概率将大大的降低,所以此处用hashCode()方法来检验对象是否相等,就有了一点equals()方法的感觉了,不再像以前那样的生硬。

我感觉这个源码应该是JDK中最优美最质朴最高效又含义最丰富的代码了,对于新手来说,也能看懂,对于大神来说,能看到一层又一层的涵义,我经验浅薄,只能看到浮于表面的两点内容,希望自己能有一天可以写出这么“不可思议”的代码。
回到讨论本身,说到hashcode()方法必然离不开equals()方法。他们的作用其实一样,在Java里都是用来对比两个对象是否相等一致。但是重写的equal()里一般比较的比较全面比较复杂,这样效率就比较低,而利用hashCode()进行对比,则只要生成一个hash值进行比较就可以了,效率很高,那么hashCode()既然效率这么高为什么还要equal()呢, 因为hashCode()并不是完全可靠,有时候不同的对象他们生成的hashcode也会一样(生成hash值得公式可能存在的问题),所以hashCode()只能说是大部分时候可靠,并不是绝对可靠,这也是所说的hash碰撞。只有把hashCode()和equals()结合起来使用,才能使得判断对象是否相等的准确性达到最高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值