A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘伯阳 中级黑马   /  2012-6-5 19:34  /  1800 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

基本概念:重写的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来判断对象是否被修改

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1 很给力!

查看全部评分

3 个回复

倒序浏览
谢谢楼主分享,学习了。
回复 使用道具 举报
逻辑上相等是什么意思?    麻烦举个例子,
回复 使用道具 举报
我也分享下我的,与大家共勉。     

在给出代码之前,先奉上一些知识点:
      (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
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马