如何比较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()方法。
语法:
它返回对象的随机生成的哈希码值,该值对于每个实例都是唯一的。随机生成的值可能会在程序的几次执行过程中发生变化。
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