Java equals()重写

参照java核心卷1

java规范中equals方法特征

  • 自反性

对于任何非空引用x, x.equals(x) 返回true;

  • 对称性

对于任何引用x, y, 当且仅当y.equals(x) 返回true, x.equals(y)返回true;

  • 传递性

对于任何引用x, y, z, 若x.equals(y)返回true, y.equals(z)返回true; 则 x.equals(z)返回true;

  • 一致性

若x和y引用的对象没有发生改变, 则反复调用x.equals(y)应该返回同样的结果.

  • 对任意非空引用x, x.equals(null) 返回false;

编写equals方法的建议:

  1. 显示参数命名为otherObject, 稍后转化成other变量
    public  boolean equals(Object otherObject)
  2. 检测this和otherObject是否是同一个对象的引用,是,返回true;
    if( this==otherObject){
         return  true;
    }
  3. 检测otherObject是否为null, 是, 返回false;
    if(otherObject ==  null){
         return  false;
    }
  4. 比较this和otherObject是否属于同一个类. 如果equals的语义在每个子类中有所改变,就使用getClass检测:
    if(getClass() != otherObject.getClass()){
         return  false;
    }
    如果所以子类语义相同,使用instanceof检测:
    if(!(otherObject  instanceof Employee)){
         return  false;
    }
  5. 将otherObject转化为相对应的类型变量other
    Employee other = (Employee)otherObject;
  6. 对所需要的比较的数据域进行比较. 如果是基本数据类型,使用a==b比较; 如果是对象比较,调用Objects.equals(a, b)进行比较
    return Objects.equals(name, other.name) && salary == other.salary && Objects.equals(hireDay, other.hireDay);
总体代码:

    public  class Employee {
     private String name;
     private  double salary;
     private Date hireDay;

    ... 

    @Override
    public boolean equals(Object obj) {
        // 如果为同一对象的不同引用,则相同
        if (this == obj) {
            return true;
        }
        // 如果传入的对象为空,则返回false
        if (obj == null) {
            return false;
        }

        // 如果两者属于不同的类型,不能相等
        if (getClass() != obj.getClass()) {
            return false;
        }

        // 类型相同, 比较内容是否相同
        Employee other = (Employee) obj;

        return Objects.equals(name, other.name) && salary == other.salary && Objects.equals(hireDay, other.hireDay);
    }

必须重写Object的equals方法!!不能写的参数不同,这样就是一个新的方法了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值