覆盖equals方法的技巧和要求(effective java总结)
2018-03-04 22:17
369 查看
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:明日再说
这里只对一些面试的高频题进行总结:
覆盖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:明日再说
相关文章推荐
- Effective Java(避免使用最终方法、覆盖equals时请遵守通用约定)
- Effective Java(避免使用最终方法、覆盖equals时请遵守通用约定)
- Effective java3——覆盖equals方法的通用约定
- Effective Java(避免使用最终方法、覆盖equals时请遵守通用约定)
- Effective Java(避免使用最终方法、覆盖equals时请遵守通用约定)
- Effective Java(避免使用最终方法、覆盖equals时请遵守通用约定)
- Effective Java(避免使用最终方法、覆盖equals时请遵守通用约定)
- Effective Java(避免使用最终方法、覆盖equals时请遵守通用约定)
- Effective Java(避免使用最终方法、覆盖equals时请遵守通用约定)
- Effective Java(避免使用最终方法、覆盖equals时请遵守通用约定)
- Effective Java(避免使用最终方法、覆盖equals时请遵守通用约定)
- Effective Java(避免使用最终方法、覆盖equals时请遵守通用约定)
- Effective Java(避免使用最终方法、覆盖equals时请遵守通用约定)
- Java进阶 —— 覆盖equals方法的技巧
- Effective Java - 对于所有对象都通用的方法 - 覆盖 equals 时请遵守通用约定
- Effective Java Item8-在覆盖equals(Object类的nonfinal方法)时遵循接口规范
- Effective Java 第8条:覆盖equals时要遵守通用约定
- java写文件时往末尾追加文件(而不是覆盖原文件),的两种方法总结
- java提高篇(十三)-----equals()方法总结
- 黑马程序员-java笔记之equals和hascode方法总结。