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

java如何比较两个对象_Java如何比较两个对象相关推荐

  1. java服务端高并发问题_Java服务端两个常见的并发错误

    理想情况来讲,开发在开始编写代码之前就应该讲并发情况考虑进去,但是大多数实际情况确是,开发压根不会考虑高并发情况下的业务问题.主要原因还是因为业务极难遇到高并发的情况. 下面列举两个比较常见的后端编码 ...

  2. java 获取两个时间差_java如何获取两个日期的时间差

    本文实例为大家分享了java如何获取两个日期的时间差,供大家参考,具体内容如下 rainBeginTime是从本地数据库获取的时间,格式为"yyyy-MM-ddTHH:mm:ss" ...

  3. java io 对象_JAVA基础知识之IO——对象序列化

    对象序列化 Java对象序列化(Serialize)是指将Java对象写入IO流,反序列化(Deserilize)则是从IO流中恢复该Java对象. 对象序列化将程序运行时内存中的对象以字节码的方式保 ...

  4. java源程序分为两大类_java源程序分为两大类

    答案:D 您的答案:D 题目分数:2.0 此题得分:2.0 13.第 19 题 Java Application 源程序的主类是指包含有( )方法的类 A.main 方法 B.toString 方法 ...

  5. java声明对象_Java中类的声明与对象创建

    类是一个模板,它描述一类对象的行为和状态:对象是类的一个具体的实例,由类构造对象的过程称为创建类的实例.如:路灯是一个类,每一个路灯就是该类的对象. 1.类声明 类声明格式 [public] [abs ...

  6. java自定义上下文对象_Java框架_Spring应用上下文对象加载配置

    我们都知道IOC是spring框架的核心,主要作用是控制反转,把我们需要的对象从容器中提供给我们,但是IOC是如何加载我们所需要的对象的? Spring容器是IOC容器的一种,它通过Applicati ...

  7. java中map如何实现遍历_Java中如何遍历Map对象的4种方法

    在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...

  8. java将字符串转成对象_java – 将字符串转换为类对象

    I am storing a class object into a string using toString() method. Now, I want to convert the string ...

  9. java 值对象_java 中设计模式(值对象)的实例详解

    java 中设计模式(值对象)的实例详解 应用场景:在Java开发时,需要来回交换大量的数据,比如要为方法传入参数,也要获取方法的返回值,该如何能更好的进行数据的交互?这个时候就需要用到我们的值对象设 ...

  10. java class 生成对象_Java反射机制(创建Class对象的三种方式)

    1:SUN提供的反射机制的类: java.lang.Class java.lang.reflect.Constructor java.lang.reflect.Field java.lang.refl ...

最新文章

  1. CentOS7 Apache调优之开启deflate压缩模块
  2. for、forEach、map、for...in、for...of的区别以及能否终止循环的总结
  3. java比较语句常犯错误和三个数比较大小
  4. 基于案例贯通 Spark Streaming 流计算框架的运行源码
  5. .NetCore技术研究-ConfigurationManager在单元测试下的坑
  6. array python 交集_模糊数学Python库简介和评测
  7. 零基础爬虫requests初阶教程,手把手教你爬数据
  8. 【2016年第6期】专题:科学数据与创新应用
  9. group by用法 mysql_MYSQL GROUP BY用法详解
  10. 拼接sql语句参数绑定
  11. SPSS说明附学习方法
  12. 虚幻引擎材质系统常用快捷键
  13. html制作日程安排,如何制作一个Web日程安排表?
  14. 基于15单片机通过ESP8266实现远程浇花系统(支持天猫精灵和小爱同学)
  15. Wifi流程机制分析:WiFi的启动
  16. 计算机页面里的坚果云删不了怎么回事,坚果云如何卸载?卸载坚果云的几种方法...
  17. 5款类蝉妈妈抖音数据工具推荐
  18. php局域网建立,win10如何建立局域网
  19. 永磁同步电机矢量控制中的双闭环是什么意思_STM32 TALK | 无感FOC方案原理机器控制难点分析...
  20. CF Round231C (ZWJ 神构造)

热门文章

  1. 5.Shell 编程从入门到精通 --- 基本文本处理
  2. 7.上传自己的代码到 composer
  3. 5. CSS 类选择器
  4. 循序渐进之Spring AOP(6) - 使用@Aspect注解
  5. java-spark的各种常用算子的写法
  6. Webpack 2 视频教程 020 - Webpack 2 中的 HMR ( Hot Module Replacement )
  7. golang+linux+pipline
  8. NBOOT分析-NBOOT.c(2)
  9. Struts2中的ValueStack类
  10. 虚拟机开机时出现Press ESC in 5 seconds to skip startup.nsh, any other key to continue问题的解决办法