How to Compare Two Objects in Java17 Mar 2025 | 6 分钟阅读 Java Object 类是所有 Java 类的父类。所有 Java 类默认都实现了 Object 类。Java Object 类提供了两个重要的方法来比较 Java 中的两个对象,即 equals() 和 hashCode() 方法。虽然 Java 提供了比较基本数据类型的内置机制,但比较对象需要更细致的方法。在本节中,我们将学习 equals() 和 hashCode() 方法的工作原理。此外,我们还将学习 如何在 Java 中比较两个对象 并提供适当的示例。 Java 提供了 Object 类的两个方法来比较对象,如下所示:
Java equals() 方法Object 类的 equals() 方法比较两个对象的相等性。如果两个对象共享相同的内存地址,则它们相等。 默认情况下,Object 类提供的 equals() 方法比较对象引用,这意味着它的行为类似于 == 运算符。 语法 该方法以一个引用对象作为参数。如果对象相等,则返回 true,否则返回 false。 也有可能一个对象等于另一个给定的对象,那么 equals() 方法将遵循 等价关系 来比较对象。
简而言之,对于任何非空引用 say x 和 y,当且仅当两个引用指向同一个对象时,它才返回 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() 方法示例在下面的示例中,我们创建了两个类 Employee.java 和 HashCodeExample.java。 在 Employee 类中,我们定义了两个字段 regno(int 类型)和 name(String 类型)。之后,我们创建了 Employee 类的构造函数,并将这两个字段作为参数传递。 为了执行对象的比较,我们创建了一个名为 HashCodeExample 的单独类。在此类中,我们创建了两个 Employee 类的实例,即 emp1 和 emp2。之后,我们通过对象调用了 hashCode() 方法。我们将哈希码值分别存储在变量 a 和 b 中。 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 教程 |
我们请求您订阅我们的新闻通讯以获取最新更新。