Equals方法:
Object类中的equals方法用于检测一个对象是否等于另外一个对象,在Object类中,这个方法将判断两个对象时都要有相同的引用。但是实际上两个对象的比较是比较两个对象的状态是否相等,及他们的实例域是否相等,比如员工类型的变量的名字,工资,和雇佣日期,如果都一样,则这两个对象认为是相等的,有一项不同,这两个对象认为不是相等的。
Equals()方法实际上的执行语句是判断对象的各个实例变量的值。
Java语言规范要求equals方法具有的特性:
- 自反性,对于任何的非空引用x ,x.equals(x)应该返回true;
- 对称性:对于任何的非空引用x 和y,x.equals(y)的结果应该和y.equals(x)的结果一致;
- 传递性:对于任何的非空引用x 和y和z ,如果x.equals(y)为true,y.equals(z)为true,则x.equals(z)也应该为true;
- 一致性:如果x和y引用的对象没有发生变化,反复调用x.equals(y)的结果应该不变。
在比较类是否匹配的时候,不建议使用instanceof来判断,比如:
Employee 继承于Person类,
if(!(Employee instanceof Person))的结果同if(!(Person instanceof Person))的结果是一致的。因为子类即超类。
对于数组类型的域,可以使用静态的Arrays.equals方法检测相应的对象的数组元素是否相等。
Static Boolean equals(type[] a,type[] b){}
如果两个数字的长度相同,并且在对应的位置上的元素也都相等,将返回true。数组的元素类型可以是8中基本类型和Object类型。
public class Equals {
public static void main(String[] args) {
Worker w1 = new Worker("小明",22);
Worker w2 = w1;
Worker w3 = new Worker("小刚",30);
Worker w4 = new Worker("小刚",30);
System.out.println(w1.equals(w2));
System.out.println(w3.equals(w4));
}
}
结果:
true
false
第一种:对象是引用类型,w1和w2指向的是同一块空间,所以返回值为true,但是w3和w4是分别开辟了内存空间,虽然它们的实例域的值是相同的,返回值是false。
这里说明的是,在标准java库包含有150多个equals方法的实现,都是对Object的equal方法进行重写,当然,我们也可以根据自己的程序需要,对equals进行重写,也可以定义自己的比较方法。