java - Java 中的 equals() 方法是如何工作的

标签 java overriding equals

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

最佳答案

默认实现,java.lang.Object 类之一,仅测试对同一对象的引用:

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

引用相等运算符在 Java Specification 中是这样描述的:

At run time, the result of == is true if the operand values are both null or both refer to the same object or array; otherwise, the result is false.

这种默认行为通常在语义上不能令人满意。例如,您无法使用 == 测试大 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 方法。

关于java - Java 中的 equals() 方法是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53736610/

相关文章:

scala - 覆盖两个 mixin 交集中的特征函数

swift - 重写 Swift 文件中的 Objective-C 方法

Haskell 设置数据类型/数据结构

Java:等于检查接口(interface)而不是类

java - 如何从 JCR(Java 内容存储库)快照备份和恢复

java - 2个字节数组的差异

java - 为什么ScannerObj.hasNextInt()需要输入内容?

java - 错过 Spring 的 Activity

java - 无法覆盖通用接口(interface)

java - 为什么我的 equals 方法无法识别对象变量?