为了账号安全,请及时绑定邮箱和手机立即绑定

Java中hashCode和equals方法之间的关系

Java中hashCode和equals方法之间的关系

牧羊人nacy 2019-09-20 15:01:12
我在很多地方读过,虽然equals在Java中覆盖hashCode方法,也应该覆盖方法,否则就是“违反合同”。但到目前为止,如果我只覆盖equals方法,而不是hashCode方法,我没有遇到任何问题。合同是什么?当我违反合同时,为什么我没有遇到任何问题?如果我没有覆盖hashCode方法,在哪种情况下我会遇到问题?
查看完整描述

3 回答

?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

你的问题是与地方元素的单一性根据双方计算的集合.equals()和.hashCode(),在一个实例键HashMap。


顾名思义,它依赖于哈希表,而哈希桶是对象的函数.hashCode()。


如果你有两个对象.equals(),但是有不同的哈希码,你就输了!


这里合同的重要部分是:必须具有相同的对象.equals().hashCode()。


这些都记录在javadoc中Object。和约书亚·布洛克说,你必须这样做在有效的Java。说够了。


查看完整回答
反对 回复 2019-09-20
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

根据文档,hashCode的默认实现将返回一些对于每个对象不同的整数


尽可能合理,Object类定义的hashCode方法确实为不同的对象返回不同的整数。(这通常通过将对象的内部地址转换为整数来实现,但

JavaTM编程语言不需要此实现技术。)


但是,有时您希望哈希码对于具有相同含义的不同对象是相同的。例如


Student s1 = new Student("John", 18);

Student s2 = new Student("John", 18);

s1.hashCode() != s2.hashCode(); // With the default implementation of hashCode

如果在集合框架中使用散列数据结构(如HashTable,HashSet),则会出现此类问题。特别是对于像HashSet这样的集合,你最终会有重复元素并违反Set契约。


查看完整回答
反对 回复 2019-09-20
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

是的,它应该被覆盖。如果您认为需要覆盖equals(),则需要覆盖hashCode(),反之亦然。hashCode()的一般契约是:


每当在执行Java应用程序期间多次在同一对象上调用它时,hashCode方法必须始终返回相同的整数,前提是不修改对象的equals比较中使用的信息。从应用程序的一次执行到同一应用程序的另一次执行,该整数不需要保持一致。


如果两个对象根据equals(Object)方法相等,则对两个对象中的每一个调用hashCode方法必须生成相同的整数结果。


如果两个对象根据equals(java.lang.Object)方法不相等,则不需要在两个对象中的每一个上调用hashCode方法必须生成不同的整数结果。但是,程序员应该知道为不等对象生成不同的整数结果可能会提高哈希表的性能。


查看完整回答
反对 回复 2019-09-20
  • 3 回答
  • 0 关注
  • 392 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信