hashcode和equals的读书笔记

来源:互联网 发布:北京网络职业学院真吗 编辑:程序博客网 时间:2024/06/06 16:35
Java对象默认的equals方法都是比较两个对象的地址的。

如果要重写equals方法,要满足一下四点:
Reflexive(自反性):即 x.equals(x)必须是true
Symmetric(对称性):即如果 x.equals(y)返回true,那么y.equals(x)也必须返回true
Transitive(传递性):即如果 x.equals(y)返回true, y.equals(z)也返回true,那么x.equals(z)也必须返回true
Consistent(一致性):即多次调用 x.equals(y)返回的结果必须保持一致。
非空特性:即对于非空对象x,x.equals(null)总是返回false

hashCode这个方法是为了在使用HashMap HashSet LinkedHashMap LinkedHashSet等数据结构的时候,为了更快速的找到key而产生的,其中通过求key的hashcode迅速找到对应的bucket位置,然后再通过equals方法来找到bucket所指向的链表里面的对应的value。这也就是为什么在重写equals方法是也要重写hashCode方法,这是为了让equals返回true的时候两个对象的hashCode必须相等,但是反之则不一定了。

那么如何写出有效的hashCode函数呢?其实最重要的是要提取出对象的重要属性。Java大神Joshua Bloch曾经在他的大作《Effective Java》这样定义一个有效的hashCode函数的产生过程:
1、去一个非零常量,比如17,将它赋给变量result

2、为每一个在equals方法里面用到过的属性计算它们的hash值c:

  • 如果属性变量是bool值:  c = (f ? 0 : 1);
  • byte, char, short 或者 int:c = (int)f;
  • long: c = (int)(f ^ (f >>> 32));
  • float: c =​Float.floatToIntBits(f);
  • double:c =Double.doubleToLongBits(f),然后执行之前处理long的步骤;
  • object: c=(f == null?0:​f.​hashCode()) ;
  • array: 将数组里面的值按照上面的处理方法处理

3、将所有的值以下形式计算

result = 37 * result + c

4、返回结果

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 妯娌关系和不来怎么办 婆婆老说我不好怎么办 婆婆对我妈不好怎么办 老公嫌老婆胸小怎么办 牙上颚的肉肿了怎么办 乐视手机音量小怎么办 手表日期调过了怎么办 机械表日期不走怎么办 差银行钱还不起怎么办 有人威胁要杀我怎么办 受人威胁要打我怎么办 胳膊起疙瘩很痒怎么办 后背长很多痘痘怎么办 肩膀两边长痘痘怎么办 红酒喝了过敏了怎么办 脚底长湿疹很痒怎么办 怀孕脚痒怎么办小窍门 孕妇烂脚丫和痒怎么办 腿上都是红血丝怎么办 全身皮肤干痒怎么办啊 脸过敏干痒脱皮怎么办 脸过敏了特别干怎么办 太阳晒后皮肤红怎么办 皮肤晒过后很痒怎么办 脸突然又红又痒怎么办 膝盖又红又痒怎么办 脸又红又痒怎么办 皮肤红痒有点热怎么办 浑身起红疙瘩 痒怎么办 身上长红包很痒怎么办 喝酒后身上很痒怎么办 身上长了小红包怎么办 腿长红包很痒怎么办 14岁脸上有雀斑怎么办 皮肤痒起红点或红块怎么办 脸过敏像长痱子怎么办 脸上有淡淡白块怎么办 过敏了脸上会起小疙瘩怎么办 脸过敏出红疙瘩怎么办 脸上长红色的小疙瘩怎么办 脸上都是小米粒痘痘怎么办