java中equals

 

java语言中equals方法具有 对称性
即对于任何引用的x和y, x.equals(y)返回值应该与y.equals(x)返回值一致
import java.util.Objects;

/**
 * java语言中equals方法具有对称性
 *即对于任何引用的x和y, x.equals(y)返回值应该与y.equals(x)返回值一致
 *
 */
public class Employee {
    private int id;
    private int salary;
    private String name;

    public Employee(int id, int salary, String name) {
        this.id = id;
        this.salary = salary;
        this.name = name;
    }

    @Override
    public boolean equals(Object obj) {
        //检测this 与 obj 是否引用同一个对象
        if(this==obj) return true;
        //检测obj 是否为 null 若为 null 则返回false
        if(obj==null) return false;

        //如果equals的语义在每个子类中有所改变 就用getClass检测
        //如果所有子类都拥有统一的语义 就用instanceof检测

        //比较this 与 obj 是否属于同一个类
        //if(getClass()!=obj.getClass()) return false;
        if(!(obj instanceof Employee)) return false;

        Employee e= (Employee) obj;
        //对所需要比较的域进行比较 使用==比较基本类型域 使用equals比较对象与
        //java中除了基本类型外 都为对象
        return id==e.id&&salary==e.salary&& Objects.equals(name,e.name);

    }
    @Override
    public int hashCode() {
        return Objects.hash(id,name,salary);
    }

    @Override
    public String toString() {
        return getClass().getName()+"{" +
                "id=" + id +
                ", salary=" + salary +
                ", name='" + name + '\'' +
                '}';
    }

}

 

public class Manager extends Employee {

    private int bonus;

    public Manager(int id, int salary, String name,int bonus) {
        super(id, salary, name);
        this.bonus=bonus;
    }

    @Override
    public boolean equals(Object obj) {

        //在子类中重新定义equals 要先调用super.equals(obj)
        if(!(super.equals(obj))) return false;
        Manager m= (Manager) obj;
        //进行自己特有域比较
        return bonus==m.bonus;
    }
    @Override
    public int hashCode() {
       // return super.hashCode()+new Integer(bonus).hashCode();
        return super.hashCode()+Integer.valueOf(bonus).hashCode();
    }

    @Override
    public String toString() {
        return super.toString()+"{bonus="+bonus+"}";
    }

}
public class Test {
    public static void main(String[] args){
     Employee e1=new Employee(1,100,"jack");
     Manager m1=new  Manager(1,100,"jack",100);

      System.out.println("e1.equals(m1): "+e1.equals(m1));
      System.out.println("m1.equals(e1): "+m1.equals(e1));

    }
}

 输出结果:

将Employee类中  if(getClass()!=obj.getClass()) return false; 注释去掉 则输出:

a b 都为null时,将返回true; 如果其中之一为null,返回false;否则返回a.equals(b)

Objects.equals( , )源码

public static boolean equals(Object a, Object b) {
        return (a == b) || (a != null && a.equals(b));
    }

对于数组类型的域,可以使用静态的Arrays.equals方法检测 

当两个数组长度相同 并且在对应位置上数据元素也均相同 将返回true

type可以是Object、int、long、short、char、byte、boolean、float、double

 public static boolean equals(type[] a, type[] a2)

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值