How to Compare Two Objects in Java

17 Mar 2025 | 6 分钟阅读

Java Object 类是所有 Java 类的父类。所有 Java 类默认都实现了 Object 类。Java Object 类提供了两个重要的方法来比较 Java 中的两个对象,即 equals()hashCode() 方法。虽然 Java 提供了比较基本数据类型的内置机制,但比较对象需要更细致的方法。在本节中,我们将学习 equals() 和 hashCode() 方法的工作原理。此外,我们还将学习 如何在 Java 中比较两个对象 并提供适当的示例。

Java 提供了 Object 类的两个方法来比较对象,如下所示:

  • Java equals() 方法
  • Java hashCode() 方法

Java equals() 方法

Object 类的 equals() 方法比较两个对象的相等性。如果两个对象共享相同的内存地址,则它们相等。

默认情况下,Object 类提供的 equals() 方法比较对象引用,这意味着它的行为类似于 == 运算符。

语法

该方法以一个引用对象作为参数。如果对象相等,则返回 true,否则返回 false。

也有可能一个对象等于另一个给定的对象,那么 equals() 方法将遵循 等价关系 来比较对象。

  • 自反性: 如果 x 是一个非空引用,调用 x.equals(x) 必须返回 true。
  • 对称性: 如果两个非空引用是 xy,则 x.equals(y) 当且仅当 y.equals(x) 返回 true 时返回 true
  • 传递性: 如果三个非空引用是 x、yz,并且 x.equals(y)y.equals(z) 都返回 true,那么 x.equals(z) 也将返回 true
  • 一致性: 如果两个非空引用是 xy,那么多次调用 x.equals(y) 将始终返回 true 或 false。它不提供用于比较的任何信息。
  • 对于任何非空引用 x,x.equals(null) 返回 false。

简而言之,对于任何非空引用 say xy,当且仅当两个引用指向同一个对象时,它才返回 true。

请记住: 当我们重写 equals() 方法时,有必要重写 hashCode() 方法。重写遵循 hashCode() 方法的约定,该约定指出相等的对象必须具有相等的哈希码。

equals() 方法示例

在下面的示例中,我们创建了 Double 类的 构造函数Long,并将相应的字符串作为参数传递,这些字符串分别存储在它们的对应对象中。

之后,在第一个 println 语句中,我们调用了 equals() 方法并将对象 y 作为参数传递,该方法比较对象 x 和 y。它返回 false,因为 x 包含 double 值,y 包含 long 值,它们不相等。

同样,在第二个 println 语句中,我们调用了 equals() 方法,并将与 Double 类 的构造函数中相同的值作为参数。它返回 true,因为 double 类的对象(即 x)包含的值与我们在 equals() 方法中传递的值相同。

ObjectComparisonExample.java

输出

Objects are not equal, hence it returns false
Objects are equal, hence it returns true

== 运算符和 equals() 方法之间的区别

Java 中,== 运算符比较两个引用是否相同。而 equals() 方法比较两个对象。

当对象具有相同的状态时(通常是比较变量),它们就相等。当对象共享类标识时,它们就相同

例如,表达式 obj1==obj2 测试相同性,而不是相等性。而表达式 obj1.equals(obj2) 比较相等性。

Java hashCode() 方法

在 Java 中,哈希码是 32 位有符号整数值。它是 JVM 为 Java 对象提供的唯一 ID。每个 Java 对象都与哈希码相关联。此哈希码在基于哈希的集合中用作索引或键,从而可以快速检索对象。哈希码由基于哈希的数据结构管理,例如 HashTable、HashSet 等。

请记住: 当我们重写 equals() 方法时,也必须重写 hashCode() 方法。

语法

它返回一个对象随机生成的哈希码值,对于每个实例都是唯一的。在程序的几次执行中,随机生成的值可能会发生变化。

hashCode 的一般约定是:

  • 当在应用程序执行期间调用 hashCode() 方法多次时,它将始终返回相同的哈希码(整数值)。请注意,对象不应被修改。
  • 如果根据 equals() 方法,两个对象相等,则调用这两个对象的 hashCode() 方法必须产生相同的整数值。
  • 根据 equals() 方法,如果两个对象不相等,则调用这两个对象的 hashCode() 方法可能会产生不同的整数值。这意味着它可以为两个对象生成相同的哈希码。
  • 虽然为每个不同的对象生成唯一的哈希码很重要,但哈希码计算应该高效,以尽量减少计算开销,尤其是对于复杂对象。

hashCode() 方法示例

在下面的示例中,我们创建了两个类 Employee.javaHashCodeExample.java

在 Employee 类中,我们定义了两个字段 regno(int 类型)和 name(String 类型)。之后,我们创建了 Employee 类的构造函数,并将这两个字段作为参数传递。

为了执行对象的比较,我们创建了一个名为 HashCodeExample 的单独类。在此类中,我们创建了两个 Employee 类的实例,即 emp1emp2。之后,我们通过对象调用了 hashCode() 方法。我们将哈希码值分别存储在变量 ab 中。

Employee.java

HashCodeExample.java

输出

hashcode of emp1 = 2398801145
hashcode of emp2 = 1852349007
Comparing objects emp1 and emp2 = false

重写 equals() 方法

相等性比较通常涉及比较对象中的实例变量或字段的值。当两个对象具有相同的状态时,即使它们在内存中是不同的实例,它们也被认为是相等的。如果我们想提供自己的实现,可以通过以下方式重写 equals() 方法。

上面的代码片段表明,如果两个员工存储在相同的内存地址,或者他们具有相同的 regno,那么他们就是相等的。当我们在上面的代码片段中使用该程序 (HashCodeExample.java) 时,我们得到以下输出。

输出

hashcode of emp1 = 2032578917
hashcode of emp2 = 1531485190
Comparing objects emp1 and emp2 = true

在 Java 中,比较对象是一项基本操作,对于各种编程任务都是必需的。通过了解可用的不同机制,例如重写 equals() 方法、实现 Comparable 接口以及使用 Comparator,您可以根据相等性有效地比较对象,或者根据应用程序的要求建立自定义排序。


下一个主题Java 教程