第9条 覆盖equals时总要覆盖hashCode

第9条 覆盖equals时总要覆盖hashCode

  • 定义:在每个覆盖了equals方法的类中,也必须覆盖hashCode方法
JavaSE6的约定
  • 1.程序的一次执行中,equals比较用到的信息没被修改,hashCode必须返回同一整数。
  • 2.同一程序多次执行过程中,每次执行返回的整数可以不一致。
  • 3.两个对象的equals方法比较是相等的,两个对象中的任意一个hashCode必须产生相同整数。
  • 4.两个对象的equals方法不相等,hashCode不一定不相等。
如果不覆盖hashCode的结果
  • 违反第3条:相等的对象必须具有相等的hashCode。
解决方案
  • 一个好的hashcode方法将会为不同的对象产生不同的hashcode。
  • 在最理想的情况下,应该把集合中所有不相等的对象均匀分布到所有可能的值上。
  • 在hashcode的计算过程中,可以将冗余域(即可以通过参与计算的其它值计算出来的值)排除在外。
  • 还有必须排除equals方法中没有的所有值,否则有可能出现两个对象逻辑相等但是生成的不同的状况。
  • 如果一个类中参与hashcode计算的变量都是不可变(final)的,而且hashcode计算的开销又非常大,那么可以在创建这个对象,或第一次使用hashcode时计算这个值,然后将hashcode保存在这个对象内部。
注意
  • 不要试图从散列码计算中排除掉一个对象的关键部分来提高性能。
  • 虽然这样得到的散列函数运行起来可能更快,但是他的效果不见得会好,可能会导致散列表慢到根本无法使用。
  • 在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值