【问题标题】:How does equals() method work in Java [duplicate]equals() 方法在 Java 中如何工作 [重复]
【发布时间】:2019-05-13 04:18:39
【问题描述】:

equals 方法比较两个对象值是否相等。我的问题是它如何比较这两个对象?它如何判断两个对象是否相等?我想知道基于它比较两个对象的内容。我不包括hashCode 方法。

【问题讨论】:

标签: java overriding equals


【解决方案1】:

默认实现,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 方法。

【讨论】:

    【解决方案2】:

    考虑下面的例子,

    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 的引用。所以它总是为使用new关键字创建的每个对象提供false

    以下是Object的方法摘录

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

    为了比较相等性检查,JLS 在我们的类中提供了 equals 方法来覆盖。这不是最终方法。 JLS 不知道程序要在什么基础上使两个对象相等。所以他们给出了非最终方法来覆盖。
    hashcode 不起到检查对象相等性的作用。 hashcode 检查/查找对象可用的存储桶。我们在哈希技术中使用hashcode,该技术被一些类使用,例如 HashMap..

    如果两个对象的 hashcode 相等,并不意味着两个对象相等。
    对于两个对象,如果 equals 方法返回 true,那么 hashcode 必须相同。

    您必须重写 equals 方法来决定在哪个基础上您希望上面代码中的对象 e1e2 相等。是基于passportNumber还是socialSecurityNumber还是passportNumber+socialSecurityNumber的组合?

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我不同意。 Equals 比较对象的创建方式。正如dystroy所解释的那样 - 通常它比较值,但并不总是,也不总是全部。例如。对于实体,equals 方法通常只比较 id 字段。
      • 我提到过,“逻辑上”和“你可以做任何事情”。 'equals' 假设“有意义地”比较对象,否则您可能没有对象的 '=='。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 2023-02-22
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      相关资源
      最近更新 更多