hashCode和equals什么时候覆写以及怎样覆写

1.何时需要重写equals方法?

当一个类具备自己特有的“逻辑相等”的概念。

2.如何覆写equals方法

(1)使用instanceof 操作符检查实参是否为正确的类型

如果传进来的类型不属于同一个类型,那也就没有比较的必要了。

(2)对于类中的每一个“关键域”(成员变量)检查实参中的域值与当前对象中的域值是否相等

两个对象相等,它们的各个属性的值肯定也是要相等的,除非你应用的场景比较特殊。接下来的几点是对这点的补充

(3)对于非float和double类型的原始类型域,使用==进行比较

(4)对于对象引用域,递归调用equals方法

(5)对于float域,使用Float.floatToIntBits(afloat)转换为int,再使用==比较

(6)对于double域,使用Double.doubleTolongBits(adouble)转换为int,再使用==比较

(7)对于数组域,调用Arrays.equals方法

3.如何覆写hashcode方法

(1)把某个非零常数值,例如17,保存在int变量result中;

(2)对于对象中每一个关键域f(指equals方法中考虑的每一个域):

(3) boolean型,计算(f? 0 : 1);

(4) byte,char,short型,计算(int);

(5)long型,计算(int)(f ^ (f>>>32));

(6) float型,计算Float.floatToIntBits(afloat);

(7)double型,计算Double.doubleToLongBits(adouble)得到一个long,再执行[2.3];

(8)对象引用,递归调用它的hashCode方法;

(9)数组域,对其中每个元素调用它的hashCode方法。

(10)将上面计算得到的散列码保存到int变量c,然后执行result=37*result+c;

(11) 返回result。

4.当改写equals方法的时候,总是要改写hashCode方法,因为相同的对象必须具有相等的散列码,否则两个截然不同的对象可能在逻辑上相等,

你觉得这样行吗?

5.如果两个对象equals,那么这两个对象的hashcode相等,如果两个对象的hashcode相等,它们不一定equals。这要看它们有没有重写hashcode和equals方法。

原文出至:http://blog.csdn.net/lifetragedy/article/details/9751079

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值