从哈希表的定义上讲:为什么java集合中重写equals方法还必须重写hashcode方法

结论是:如果重写equals方法却不重写hashcode方法会使哈希表没有意义,同时也违反了java hashcode设计原则(equals相同,hashcode也必须相同),会导致相同的元素重复放入哈希表。

  • 首先哈希表的定义如下:给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。
  • 再者,从概念上来讲,关键字key应该代表元素的关键信息,如果关键字key不同,那么应该代表着元素也不同。当我们重写equals,会将对象的地址对比改变为自定义关键信息对比。此时关键字key应该是我们自定义的关键信息,而不是hashcode默认的内存地址相关信息。所以我们需要根据自定义关键信息重写hashcode
  • 最后,我认为哈希表属于数据结构中的集合结构,集合具有互异性,即不允许有重复的元素。

哈希码的通用约定如下:

  • 在java程序执行过程中,在一个对象没有被改变的前提下,无论这个对象被调用多少次,hashCode方法都会返回相同的整数值。对象的哈希码没有必要在不同的程序中保持相同的值。
  • 如果2个对象使用equals方法进行比较并且相同的话,那么这2个对象的hashCode方法的值也必须相等
  • 如果根据equals方法,得到两个对象不相等,那么这2个对象的hashCode值不需要必须不相同。但是,不相等的对象的hashCode值不同的话可以提高哈希表的性能。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值