HashCode的意义和作用

HashCode的介绍

哈希码是按照某种规则生成的int类型的数值
哈希码并不是完全唯一的。
让同一个类的对象按照自己不同的特征尽量的有不同的哈希码,但不是说不同的对象哈希码就一定不同,也有相同的情况。
首先我们需要了解hashCode方法和equals方法两个重要的规范:

规范1

若重写了某个类的equals方法,请一定重写hashCode方法,要能保证通过equals方法判断为true的两个对象,其hashCode方法的返回值相等,换句话说,就是要保证”两个对象相等,其hashCode一定相同”始终成立;

规范2

若equals方法返回false,即两个对象不相等,并不要求这两个对象的hashCode得到不同的数;
在这些规范下才能得到如下推论:
  1. 两个对象相等,其HashCode一定相同;
  2. 两个对象不相等,其HashCode有可能相同;
  3. HashCode相同的两个对象,不一定相等;
  4. HashCode不相同的两个对象,一定不相等;
关于第四条推论,有人可能会举出反例:两个类的hashCode方法故意返回不同的值,其对应的equals方法始终返回true,但这意味他们生成的对象和其他任意对象均会相等,其次是违反了规范1,所以反例是无效的。
 
这个只是规范,违反并不会造成编译或运行时的错误,但会在存储一些集合中时造成潜在的bug,因为有些集合会首先根据hashCode来判断是否重复。

HashCode的意义

HashMap插入重复的key,HashSet插入重复的value,,其value会被覆盖掉,那么,就有一个问题,他们怎么来判断重复呢?假设数据量庞大,每次插入要进行的判断重复操作就会非常耗时。
据了解,他们判断两个对象是否相等的规则是:
 
1)首先判断两个对象的hashCode是否相等
如果不相等,认为两个对象也不相等,完毕
如果相等,转入2)
 
2)判断两个对象用equals运算是否相等
如果不相等,认为两个对象也不相等
如果相等,认为两个对象相等(equals()是判断两个对象是否相等的关键)
 
由此判断方式可知,如果你违反了规范1,致使出现两个对象相等,但其hashCode不等的情况,这些集合会认为是两个不同对象,从而不会覆盖,造成问题。
posted @   多见多闻  阅读(30)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示