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)