Effective java 第三章对于所有对象都通用的方法(一) 读书笔记

时间:2021-04-16 16:06:59

 对于所有对象都通用的方法

覆盖equals时请遵守通用约定

类的每个实例本质上都是唯一的。
不关心类是否提供了逻辑相等的测试功能
超类已经覆盖了equals,从超类继承过来的行为对于子类也是合适的。
类是私有的或是包级私有的,可以确定它的equals方法永远不会被调用。
throw new AssertionError()

一般覆盖Object.equals都是值类
但有一种值类不需要覆盖equals方法,即实例受控,确保每个值至多只存在一个对象的类。如枚举

覆盖equals方法,通用约定。
自反性
对称性
传递性
一致性
非空性

里氏替换原理
一个类型的任何重要属性也将适用于它的子类型。

实现高质量equals方法的诀窍
1.使用==操作符检查“参数是否为这个对象的引用”
2.使用instanceof操作符检查“参数是否为正确的类型”
3.把参数转换成正确的类型
4.对于该类中的每个“关键域”,检查参数中的域是否与该对象中对应的域相匹配。

覆盖equals时总要覆盖hashCode
不要企图让equals方法过于智能
不要将equals声明中的Object对象替换为其他的类型。

覆盖equals时总要覆盖hashCode
约定:
在应用程序的执行期间,只要对象的equals方法的比较操作所用到的信息没有被修改,那么对这同一个对象调用多次,hashCode方法都必须始终如一地返回同一个整数。在同一个应用程序的多次执行过程中,每次执行所返回的整数可以不一致。
如果对象根据equals(Object)方法比较是相等的,那么调用这两个对象中任意一个对象的hashaCode方法都必须产生同样的整数结果。
如果两个对象根据equals(Object)方法比较是不相等的,那么调用这两个对象中任意一个对象的hashCode方法,则不一定要产生不同的整数结果。但是程序员应该知道,给不相等的对象产生截然不同的整数结果,有可能提高散列表的性能。

hash.put
hash.get
得不到

编写一个合法但并不好用的hashCode方法没有任何价值

在散列码的计算过程中,可以把冗余域排除在外。