java如何比较两个对象_Java如何比较两个对象

Java如何比较两个对象

1 Java如何比较两个对象的介绍

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

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

Java equals() 方法

Java hashCode() 方法

2 Java equals()方法

2.1 Java equals()方法的介绍

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

语法:

public boolean equals(Object obj)

该方法将参考对象解析为参数。如果对象相等,则返回true,否则返回false。

一个对象也可能等于另一个给定的对象,然后equals() 方法遵循等价关系来比较这些对象。

自反:如果x是非空引用,则x.equals(x) 的调用必须返回true。

对称:如果两个非空引用是X和Y,x.equals(Y) 将返回真当且仅当y.equals(x) 返回真。

传递:如果三个非空引用是X,Y和Z,x.equals(z) 也将返回真,如果x.equals(Y) 和y.equals(Z) 都返回真。

一致:如果两个非null引用分别是x和y,则x.equals(y) 的多次调用将不断返回true或false。它不提供比较中使用的任何信息。

对于任何非null引用x,x.equals(null) 返回false。

简而言之,对于任何非空引用,例如x和y,当且仅当两个引用都引用相同的对象时,它才返回true。

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

2.2 Java equals()方法案例

在下面的示例中,我们创建了Double和Long类的构造函数,并传递了相应的值作为分别存储在其对象中的参数。

之后,在第一个println语句中,我们调用了equals() 方法,并将对象y解析为比较对象x和y的参数。它返回false,因为x持有双精度值,而y持有不相等的长值。

同样,在第二个println语句中,我们调用了equals() 方法并解析与Double类的构造函数中相同的值。它返回true,因为双精度类(即x)的对象具有与equals() 方法中传递的值相同的值。

/**

* 一点教程网: http://www.yiidian.com

*/

public class ObjectComparisonExample

{

public static void main(String[] args)

{

//creating constructor of the Double class

Double x = new Double(123.45555);

//creating constructor of the Long class

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

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

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

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

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

4 Java hashCode()方法

4.1 Java hashCode()方法的介绍

在Java中,哈希码是32位带符号整数值。它是JVM提供给Java对象的唯一ID 。每个Java对象都与哈希码相关联。哈希码由基于哈希的数据结构(例如HashTable,HashSet等)管理。

注意:当我们覆盖equals() 方法时,也必须覆盖hashCode() 方法。

语法:

public int hashCode()

它返回对象的随机生成的哈希码值,该值对于每个实例都是唯一的。在程序的多次执行过程中,随机生成的值可能会更改。

hashCode的一般约定为:

在应用程序执行过程中多次调用它时,hashCode() 方法将始终返回相同的哈希码(整数值)。请注意,不应修改该对象。

如果根据equals() 方法两个对象相等,则在这两个对象上调用hashCode()方法必须产生相同的整数值。

如果两个对象根据equals() 方法不相等,则不必这样做,则在这两个对象上调用hashCode() 方法可能会产生不同的整数值。这意味着它可以为两个对象产生相同的哈希码。

4.2 Java hashCode()方法案例

在以下示例中,我们创建了两个类Employee.java和HashCodeExample.java。

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

为了进行对象比较,我们创建了一个单独的名为HashCodeExample的类。在此类中,我们创建了Employee类的两个实例,即emp1和emp2。之后,我们使用对象调用了hashCode() 方法。我们已经将哈希码值分别存储在变量a和b中。

Employee.java:

/**

* 一点教程网: http://www.yiidian.com

*/

public class Employee

{

private int regno;

private String name;

//constructor of Employee class

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:

/**

* 一点教程网: http://www.yiidian.com

*/

public class HashcodeExample

{

public static void main(String[] args)

{

//creating two instances of the Employee class

Employee emp1 = new Employee(918, "Maria");

Employee emp2 = new Employee(918, "Maria");

//invoking hashCode() method

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

5 覆盖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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值