之前在某个帖子中讨论到了equals方法的重写问题,但表述的不清楚,感觉有必要把这个问题好好表述一下,这些笔记是当时读effectiveJava时做的,认为作者分析的非常精彩,很是佩服。今晚又花了很长时间{ps:现在时间相当晚了已经},重新整理了一下要点,分享给大家,重点在后边,请大家耐心看。
基本概念:重写的equals一般都是用来判断逻辑上的相等, == 则是完全相等。
effective -java 上说,重写 equals方法看起来很简单,但是在很多情况下很容易导致问题,这些问题有时会导致严重后果 { 个人认为后果可能是问题很隐蔽,不容易找出来 } 。最简单的办法就是尽量避免重写 equals 方法。
有些时候 equals 方法是不需要的 :
1、程序中没必要关心他提供的equals是否能够返回真正的逻辑相等,比如java.util.Random
2、单例或每个实例本身满足唯一性,比如说线程Thread{貌似是这个意思:Each instance of the class is inherently unique}
3、父类已经重写了equals,子类最好不要重写{后面会描述重写子类equals带来的纠结问题}
什么时候应该重写equals方法:
1、期望通过equals方法来判断两个对象是否是逻辑上相等。
2、想将对象用做map的key值或set的元素时,同时要重写hashCode方法。
接下来描述一下重写equals应当要满足的条件:
1. 自等:x.equals(x) == true 这个是最起码的要求
2. 对称:x.equals(y) == true ,必须有 y.equals(x) == true;
3. 传递:x.equals(y) == true,x.equals(z) == true ;必须有 y.equals(z) == true
4. 非空:x.equals(null) 应总是返回false;
5. 恒定(consistent),x.equals(y) 应恒返回true或false, 以支持用equals来判断对象是否被修改
基本概念:重写的equals一般都是用来判断逻辑上的相等, == 则是完全相等。
effective -java 上说,重写 equals方法看起来很简单,但是在很多情况下很容易导致问题,这些问题有时会导致严重后果 { 个人认为后果可能是问题很隐蔽,不容易找出来 } 。最简单的办法就是尽量避免重写 equals 方法。
有些时候 equals 方法是不需要的 :
1、程序中没必要关心他提供的equals是否能够返回真正的逻辑相等,比如java.util.Random
2、单例或每个实例本身满足唯一性,比如说线程Thread{貌似是这个意思:Each instance of the class is inherently unique}
3、父类已经重写了equals,子类最好不要重写{后面会描述重写子类equals带来的纠结问题}
什么时候应该重写equals方法:
1、期望通过equals方法来判断两个对象是否是逻辑上相等。
2、想将对象用做map的key值或set的元素时,同时要重写hashCode方法。
接下来描述一下重写equals应当要满足的条件:
1. 自等:x.equals(x) == true 这个是最起码的要求
2. 对称:x.equals(y) == true ,必须有 y.equals(x) == true;
3. 传递:x.equals(y) == true,x.equals(z) == true ;必须有 y.equals(z) == true
4. 非空:x.equals(null) 应总是返回false;
5. 恒定(consistent),x.equals(y) 应恒返回true或false, 以支持用equals来判断对象是否被修改
