equals()和hashcode()

Java的Object类中的hashCode()是native方法,返回对象内存地址。equals比较的是对象的内存地址。当equals相等时,hashCode必须相等;反之,hashCode相等并不意味着equals也相等。在涉及哈希表如HashSet、HashMap时,为避免哈希冲突和保证数据一致性,重写equals时必须重写hashCode。未同步重写可能导致数据冗余。
摘要由CSDN通过智能技术生成

Java中Object的hashCode()和equals()

从图中可知,hashCode()是一个Java本地方法native,返回值为实例对象引用中存储的对象的内存地址,而equals()的比较就是比较实例对象的内存地址是否相同。

在hashCode()方法的注释说明中,总结有如下陈述:

a. Java程序运行时,同一实例对象多次调用hashCode()方法时,必须一致返回相同的整数数字,而前提是对象进行equals()比较时所用信息没有被修改;

b. 如果调用equals()方法,两个对象相同,则两个对象的任意一个对象调用hashCode()都必须返回相同整数结果;

c. 如果调用equals()方法两个实例对象不相等,则两个对象的任意一个调用hashCode()方法不强制要求一定生成不同的整数结果;但是程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。

综合上述,hashCode()和equals()保持一致,如果equals方法返回true,那么两个对象的hasCode()返回值必须一样;如果equals方法返回false,hashcode可以不一样,但不利于哈希表的性能。因此,重写equals()方法就必须重写hashCode()方法,就是为了保证hash表的性能。

而且,在不重写equals()和hashCode()时,存在不同实例对象的hashCode()返回值相同,而equals()不同,也就是Hash冲突。根本原因是因为hashCode()返回值为int,最大值为Integer.Max_Value,如果对象足够多会出现Hash冲突。

在重写hashCode()和equals()方法时,对于Hash表而言,判断hashcode与equals都相等时,才会判断两个实例对象是重复的。如果仅仅重写其中一个方法,仍会导致出现重复性的数据插入等现象,数据冗余。因此必须同时重写上述两个方法。

总结:

1、涉及到Hash表等相关数据结构(如HashSet、HashMap等)操作的,一定要保持equals()与hashCode()的同步。如果仅仅是比较内容是否相等而重写了equals()的,则不用重写hashCode();

2、如果equals()相等,则hashCode()一定相等;

3、如果两个对象的hashCode() 相等,则equals()不一定相等;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值