黑马程序员技术交流社区

标题: 深入equals方法,与大家分享 [打印本页]

作者: 刘伯阳    时间: 2012-6-5 19:34
标题: 深入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来判断对象是否被修改


作者: 杨天皓    时间: 2012-6-5 21:15
谢谢楼主分享,学习了。
作者: 杜俊彪    时间: 2012-6-5 22:16
逻辑上相等是什么意思?    麻烦举个例子,
作者: 徐炯    时间: 2012-6-6 13:00
我也分享下我的,与大家共勉。     

在给出代码之前,先奉上一些知识点:
      (1)“==”相关:
              a、对基本数据类型变量来说,它比较的是左右两边的值是否相等。
              b、对引用数据类型变量来说,它比较的是左右两边的引用地址是否相同。
      (2)“equals()”相关:
              首先,该方法是定义在Object类中的,则java中每个类都可以调用该方法。
                     a、对于Object类中的equals()方法来说,它是判断调用equals()方法的引用与传递进来的引用是否一致,是否指向同一个对象,此时可以认为是等价于“==”的。
                     b、对于String类中的equals()方法来说,它是对Object类中的equals()方法进行重写之后的,它判断的是当前字符串与传进来的字符串的内容是否一致。

代码:
      class Value
       {
          int i;
       }
      public class EqualsMethod2 {
            public static void main(String[] args) {
                          Value v1 = new Value();
                          Value v2 = new Value();
                          v1.i = v2.i = 100;
                      System.out.println(v1.equals(v2));
              }
       }
代码运行结果:false

堆内存为v1,v2分配的地址不同,所以false





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2