重写HashCode()的原因

首先Object关于hashCode()和equals()的区别

    public native int hashCode();
 
    public boolean equals(Object obj) {
        return (this == obj);
    }

equals比较的是对象的内存地址,HashCode返回的也是对象的内存地址,所以在不重写的情况下,equals返回true则表明这两个对象的hashcode值一样。

hashCode方法一般的规定是:

1.在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。    
2.如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。    
3.如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。

但是如果equals方法返回false,hashcode不一样,这样不利于哈希表的性能,因为map、set在存储时是根据对象的hashcode值计算的,查找时是根据equals()、hashcode一起判断的。

在向HashSet集合中存入一个元素时,HashSet会调用对象(存入对象)的hashCode()方法来得到该对象的hashCode()值,然后根据该hashCode值决定该对象在HashSet中存储的位置。

简单的说:HashSet集合判断两个元素相等的标准是:两个对象通过equals()方法比较相等,并且两个对象的HashCode()方法返回值也相等。如果两个元素通过equals()方法比较返回true,但是它们的hashCode()方法返回值不同,HashSet会把它们存储在不同的位置,依然可以添加成功。同样:在Map集合中,例如其子类Hashtable(jdk1.0错误的命名规范),HashMap,存储的数据是<key,value>对,key,value都是对象,被封装在Map.Entry,即:每个集合元素都是Map.Entry对象。在Map集合中,判断key相等标准也是:两个key通过equals()方法比较返回true,两个key的hashCode的值也必须相等。判断valude是否相等equal()相等即可。

 

重写hashCode()的原则

    (1)同一个对象多次调用hashCode()方法应该返回相同的值;

    (2)当两个对象通过equals()方法比较返回true时,这两个对象的hashCode()应该返回相等的(int)值;

    (3)对象中用作equals()方法比较标准的Filed(成员变量(类属性)),都应该用来计算hashCode值。

      计算hashCode值的方法:      

//f是Filed属性
boolean    hashCode=(f?0:1)
(byte,short,char,int)      hashCode=(int)f
long       hashCode=(int)(f^(f>>>32))
float       hashCode=Float.floatToIntBits(f)
double   hashCode=(int)(1^(1>>>32))
普通引用类型    hashCode=f.hashCode()

//将计算出的每个Filed的hashCode值相加返回,为了避免直接相加产生的偶然相等(单个不相等,加起来就相等了),为每个Filed乘以一个质数后再相加
return  f1.hashCode()*17+(int)f2.13
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值