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

时间:2013-03-21 08:34:44

标签: java override equals

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

3 个答案:

答案 0 :(得分:6)

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

150    public boolean equals(Object obj) {
151        return (this == obj);
152    }

引用相等运算符在Java Specification

中的描述如下
  

在运行时,如果操作数值都是,则==的结果为真   null或两者都指向同一个对象或数组;否则,结果   是假的。

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

Integer a = new Integer(1000);
Integer b = new Integer(1000);
System.out.println(a==b); // prints false

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

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

启用此功能:

System.out.println(a.equals(b)); // prints true

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

您似乎知道,您应该相应地覆盖hashCode方法。

答案 1 :(得分:4)

考虑以下示例,

public class Employee {
    String name;
    String passportNumber;
    String socialSecurityNumber;
    public static void main(String[] args) {
        Employee e1 = new Employee();
        Employee e2 = new Employee();
        boolean isEqual = e1.equals(e2);  // 1
        System.out.println(isEqual);
    }
}

在注释// 1的代码中,它调用Object类中的继承equals方法,该方法只是比较e1e2的引用。因此,对于使用false关键字创建的每个对象,它总是会new

以下是Object

中的方法摘录
public boolean equals(Object obj) {
    return (this == obj);
}

为了比较相等性检查,JLS在我们的类中使用了equals方法来覆盖。这不是最终方法。 JLS不知道programmar想要使两个对象相等的基础。所以他们给出了非最终方法来覆盖 hashcode不起作用来检查对象的相等性。 hashcode检查/找到对象可用的Bucket。我们在散列技术中使用hashcode,这些技术被HashMap等一些类使用。

如果两个对象的哈希码相等,则表示两个对象相等。
对于两个对象,如果equals方法返回true,则hashcode必须相同。

您必须覆盖equals方法以确定您希望对象e1和上述代码中的e2相等的基础。是基于passportNumber还是socialSecurityNumber还是passportNumber+socialSecurityNumber的组合?

I want to know based on what it compares the two objects.

默认情况下,答案是在继承的Objectequals方法的帮助下,它使用==符号比较两个对象的引用相等性。代码如上所示。

答案 2 :(得分:0)

逻辑上,equals不比较对象(但是你可以用它做任何事情),它会比较值。对于对象比较,有'=='运算符