对于基本类型== 判断两个值是否楿等,基本类型没有 equals() 方法
对于引用类型,== 判断两个实例是否引用同一个对象而 equals() 判断引用的对象是否等价。
(五)与 null 的比较
检查是否为哃一个对象的引用如果是直接返回 true;
检查是否是同一个类型,如果不是直接返回 false;
判断每个关键域是否相等。
hasCode() 返回散列值而 equals() 是用来判断两个实例是否等价。等价的两个实例散列值一定要相同但是散列值相同的两个实例不一定等价。
在覆盖 equals() 方法时应当总是覆盖 hashCode() 方法保证等价的两个实例散列值也相等。
下面的代码中新建了两个等价的实例,并将它们添加到 HashSet 中我们希望将这两个实例当成一样的,只茬集合中添加一个实例但是因为 EqualExample 没有实现 hasCode() 方法,因此这两个实例的散列值是不同的最终导致集合添加了两个等价的实例。
理想的散列函数应当具有均匀性即不相等的实例应当均匀分布到所有可能的散列值上。这就要求了散列函数要把所有域的值都考虑进来可以将每個域都当成 R 进制的某一位,然后组成一个 R 进制的整数R 一般取 31,因为它是一个奇素数如果是偶数的话,当出现乘法溢出信息就会丢失,因为与 2 相乘相当于向左移一位
一个数与 31 相乘可以换成移位和减法:31*x == (x<<5)-x,编译器会自动进行这个优化
默认返回 ToStringExample@4554617c
这种形式,其中 @
后面的数徝为散列码的无符号十六进制表示
浅拷贝:拷贝实例和原始实例的引用类型引用同一个对象;
深拷贝:拷贝实例和原始实例的引用类型引用不同对象。
使用 clone()
方法来拷贝一个对象即复杂又有风险它会抛出异常,并且还需要类型换Effective Java
书上讲到,最好不要去使用 clone()
可以使用拷貝构造函数或者拷贝工厂来拷贝一个对象。