您的位置:首页 > Web前端

覆盖equals方法的技巧和要求(effective java总结)

2018-03-04 22:17 309 查看
Effective Java

这里只对一些面试的高频题进行总结:

覆盖equals方法:

在覆盖equals方法的时候有五点需要注意的:

1:自反性 2对称性 3传递性 4非空性(不能与null)

5:一致性:如果两个对象相等,那么它们要始终相等,除非其中的对象改变了,所以不要使equals方法依赖不可靠资源

覆盖equals方法的技巧:

1 使用==判断是否为对象自身的引用

2 使用instance of判断是否是正确的类型

3 进行类型转换

4 对对象中的“关键域”进行是否相等的比较

覆盖equals的时候总要覆盖hashCode方法,

因为如果两个对象的根据equals()比较的时候是相等的,难么这两个对象一定要有相同的hash值,但是不同的对象却不一定有不同的hash值。

覆盖hashCode()的技巧:

1:定义一个result变量设置初始值为17或者其他适当的也行

2:计算各个关键域的int类型的散列码c:

各个类型的计算方法:

1 boolean (c=f?1:0)

2 byte char short int (int)c

3 long (int)(f^(f>>>32))

4 double 先通过Double.doubleToLongBits(f)转换为long 然后计算

5 如果是对象 null返回空值 如果该对象的类的equals是递归的调用equals方法来比较这个域,则同样为这个域递归的调用hashCode

6 如果是数组则为每一个元素应用上面的规则

3: 把计算出来的各个关键域的散列码c用下面的公式合并

result=31*result+c;

选择31是因为它是一个奇素数,如果是偶数乘法溢出会丢失信息,而且31可以被编译器优化成(result<<5-result)

谨慎的覆盖clone:明日再说
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐