Java教程

如何比较Java中的两个对象

Java对象类是所有Java类的超类。默认情况下,所有Java类都实现Object类。 Java Object类提供了两种重要的方法,可以 比较Java中的两个对象 ,即 equals() hashCode()方法。在本节中,我们将学习 equals() hashCode()方法的工作方式。与此同时,我们还将学习 如何用适当的示例比较Java中的两个对象
Java提供了Object类的两种比较对象的方法,如下所示:
Java equals()方法 Java hashCode()方法

Java equals()方法

Object类的 equals()方法比较两个对象的相等性。如果两个对象共享相同的内存地址,则它们将相等。
语法:
public boolean equals(Object obj)
该方法将引用对象解析为参数。如果对象相等,则返回true,否则返回false。
一个对象也可能等于另一个给定对象,然后equals()方法遵循 对等关系比较对象。
自反: 如果 x 是非空引用,则 x.equals(x)的调用必须返回true。 对称: 如果两个非空引用分别为 x y,则x.equals(y)将返回 true 当且仅当 y.equals(x)返回 true 传递性: 如果三个非空引用分别为 x,y z,则x.equals(z)也将返回如果 x.equals(y )和 y.equals(z)均返回 true ,则为 true 一致: 如果两个非空引用分别是 x y ,则 x.equals(y )不断返回true或false。它不提供比较中使用的任何信息。 对于任何非空引用 x,x.equals(null)返回false。
简而言之,对于任何非空引用,例如 x y ,当且仅当两个引用都引用相同的对象时,它才返回true。
记住: 当我们重写equals()方法时,有必要重写hashCode()方法。覆盖遵循hashCode()方法的约定,该方法指出,相等的对象必须具有相等的哈希码。

equals()方法的示例

例如,我们创建了 Double Long 类的构造函数 ,并传递相应的值作为分别存储在对象中的参数。
然后,在第一个println语句中,我们调用了equals()方法并解析对象y作为比较对象x和y的参数。它返回 false ,因为x持有double值,y持有不等于long的值。
同样,在第二个println语句中,我们调用了equals()方法,解析与Double class的构造函数中相同的值。它返回 true ,因为double类的对象(即x)具有与equals()方法中传递的值相同的值。
ObjectComparisonExample.java
public class ObjectComparisonExample {
    public static void main(String[] args) {
        //creating constructor of the double class
        Double x = new Double(123.45555);
        long y = new Long(9887544);
        //invoking the equals() method
        System.out.println("Objects are not equal, hence it returns " + x.equals(y));
        System.out.println("Objects are equal, hence it returns " + x.equals(123.45555));
    }
}
输出:
Objects are not equal, hence it returns false
Objects are equal, hence it returns true

==运算符和equals()方法之间的差异

在Java, == 运算符比较两个引用是否相同。 equals()方法比较两个对象。
当对象具有相同状态(通常是比较变量)时,它们就是 equal 。当对象共享类标识时,它们是 相同的。例如,表达式 obj1 == obj2 用于测试标识,而不是相等性。虽然表达式 obj1.equals(obj2)比较相等。

Java hashCode()方法

在Java中,哈希码是一个32位有符号整数值。它是JVM为Java对象提供的唯一ID。每个Java对象都与哈希码相关联。哈希代码由基于哈希的数据结构(例如HashTable,HashSet等)管理。
记住: 当我们覆盖equals()方法时,有必要也会覆盖hashCode()方法。
语法:
public int hashCode()
它返回对象的随机生成的哈希码值,该值对于每个实例都是唯一的。随机生成的值可能会在程序的几次执行过程中发生变化。
hashCode的一般约定为:
在应用程序执行期间多次调用它时,hashCode()方法将始终返回相同的哈希码(整数值)。请注意,不应修改该对象。 如果根据equals()方法两个对象相等,则在这两个对象上调用hashCode()方法必须产生相同的整数值。 如果两个对象根据equals()方法不相等,则不必在这两个对象上调用hashCode()方法可能会产生不同的整数值。这意味着它可以为两个对象产生相同的哈希码。

hashCode()方法的示例

在下面的示例中,我们创建了两个类 Employee.java HashCodeExample .java
在Employee类中,我们定义了两个类型为int的regno和类型为String的名称的字段。之后,我们创建了Employee类的构造函数,并将这两个字段作为参数传递。
要执行对象的比较,我们创建了一个单独的类,名为 HashCodeExample 。在此类中,我们创建了Employee类的两个实例,即 emp1 emp2 。之后,我们使用对象调用了hashCode()方法。我们将哈希码值分别存储在变量 a b 中。
Employee.java
public class Employee {
    private int regno;
    private String name;
    public Employee(int regno, String name) {
        this.name = name;
        this.regno = regno;
    }
    public int getRegno() {
        return regno;
    }
    public void setRegno(int Regno) {
        this.regno = regno;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
HashCodeExample.java
public class HashcodeExample {
    public static void main(String[] args) {
        Employee emp1 = new Employee(918, "Maria");
        Employee emp2 = new Employee(918, "Maria");
        int a=emp1.hashCode();
        int b=emp2.hashCode();
        System.out.println("hashcode of emp1 = " + a);
        System.out.println("hashcode of emp2 = " + b);
        System.out.println("Comparing         objects emp1 and emp2 = " + emp1.equals(emp2));
    }
}
输出:
hashcode of emp1 = 2398801145
hashcode of emp2 = 1852349007
Comparing objects emp1 and emp2 = false

重写equals()方法

如果我们要提供自己的实现,可以按以下方式重写equals()方法。
//overriding equals() method
@Override
public boolean equals(Object obj) {
    if (obj == null)
        return false;
    if (obj == this)
        return true;
    return this.getRegno() == ((Employee) obj). getRegno();
}
上面的代码片段显示,如果两个雇员存储在相同的内存地址中或具有相同的regno,则它们将相等。当我们使用上述代码片段运行程序(HashCodeExample.java)时,将获得以下输出。
输出:
hashcode of emp1 = 2032578917
hashcode of emp2 = 1531485190
Comparing objects emp1 and emp2 = true

昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4