equals()方法如何在Java中工作

jac*_*ind 5 java overriding equals

equals方法比较两个对象值是否相等.我的问题是它如何比较这两个对象?怎么能告诉两个对象是否相等?我想知道它基于它比较两个对象.我不包括这个hashCode方法.

Den*_*ret 6

默认实现,即类之一java.lang.Object,只是测试引用是否属于同一个对象:

150    public boolean equals(Object obj) {
151        return (this == obj);
152    }
Run Code Online (Sandbox Code Playgroud)

Java规范中描述了引用相等运算符:

在运行时,如果操作数值都为null或者两者都引用相同的对象或数组,则==的结果为true; 否则,结果是错误的.

此默认行为通常在语义上不令人满意.例如,您无法使用以下方法测试大型Integer实例的相等性==:

Integer a = new Integer(1000);
Integer b = new Integer(1000);
System.out.println(a==b); // prints false
Run Code Online (Sandbox Code Playgroud)

这就是覆盖该方法的原因:

722     public boolean equals(Object obj) {
723         if (obj instanceof Integer) {
724             return value == ((Integer)obj).intValue();
725         }
726         return false;
727     }
Run Code Online (Sandbox Code Playgroud)

这使得:

System.out.println(a.equals(b)); // prints true
Run Code Online (Sandbox Code Playgroud)

覆盖默认行为的类应根据标识字段(通常是所有字段)的相等性来测试语义相等性.

如您所知,您应该相应地覆盖该hashCode方法.