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
java如何比较两个对象_Java如何比较两个对象相关推荐
- java服务端高并发问题_Java服务端两个常见的并发错误
理想情况来讲,开发在开始编写代码之前就应该讲并发情况考虑进去,但是大多数实际情况确是,开发压根不会考虑高并发情况下的业务问题.主要原因还是因为业务极难遇到高并发的情况. 下面列举两个比较常见的后端编码 ...
- java 获取两个时间差_java如何获取两个日期的时间差
本文实例为大家分享了java如何获取两个日期的时间差,供大家参考,具体内容如下 rainBeginTime是从本地数据库获取的时间,格式为"yyyy-MM-ddTHH:mm:ss" ...
- java io 对象_JAVA基础知识之IO——对象序列化
对象序列化 Java对象序列化(Serialize)是指将Java对象写入IO流,反序列化(Deserilize)则是从IO流中恢复该Java对象. 对象序列化将程序运行时内存中的对象以字节码的方式保 ...
- java源程序分为两大类_java源程序分为两大类
答案:D 您的答案:D 题目分数:2.0 此题得分:2.0 13.第 19 题 Java Application 源程序的主类是指包含有( )方法的类 A.main 方法 B.toString 方法 ...
- java声明对象_Java中类的声明与对象创建
类是一个模板,它描述一类对象的行为和状态:对象是类的一个具体的实例,由类构造对象的过程称为创建类的实例.如:路灯是一个类,每一个路灯就是该类的对象. 1.类声明 类声明格式 [public] [abs ...
- java自定义上下文对象_Java框架_Spring应用上下文对象加载配置
我们都知道IOC是spring框架的核心,主要作用是控制反转,把我们需要的对象从容器中提供给我们,但是IOC是如何加载我们所需要的对象的? Spring容器是IOC容器的一种,它通过Applicati ...
- java中map如何实现遍历_Java中如何遍历Map对象的4种方法
在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...
- java将字符串转成对象_java – 将字符串转换为类对象
I am storing a class object into a string using toString() method. Now, I want to convert the string ...
- java 值对象_java 中设计模式(值对象)的实例详解
java 中设计模式(值对象)的实例详解 应用场景:在Java开发时,需要来回交换大量的数据,比如要为方法传入参数,也要获取方法的返回值,该如何能更好的进行数据的交互?这个时候就需要用到我们的值对象设 ...
- java class 生成对象_Java反射机制(创建Class对象的三种方式)
1:SUN提供的反射机制的类: java.lang.Class java.lang.reflect.Constructor java.lang.reflect.Field java.lang.refl ...
最新文章
- CentOS7 Apache调优之开启deflate压缩模块
- for、forEach、map、for...in、for...of的区别以及能否终止循环的总结
- java比较语句常犯错误和三个数比较大小
- 基于案例贯通 Spark Streaming 流计算框架的运行源码
- .NetCore技术研究-ConfigurationManager在单元测试下的坑
- array python 交集_模糊数学Python库简介和评测
- 零基础爬虫requests初阶教程,手把手教你爬数据
- 【2016年第6期】专题:科学数据与创新应用
- group by用法 mysql_MYSQL GROUP BY用法详解
- 拼接sql语句参数绑定
- SPSS说明附学习方法
- 虚幻引擎材质系统常用快捷键
- html制作日程安排,如何制作一个Web日程安排表?
- 基于15单片机通过ESP8266实现远程浇花系统(支持天猫精灵和小爱同学)
- Wifi流程机制分析:WiFi的启动
- 计算机页面里的坚果云删不了怎么回事,坚果云如何卸载?卸载坚果云的几种方法...
- 5款类蝉妈妈抖音数据工具推荐
- php局域网建立,win10如何建立局域网
- 永磁同步电机矢量控制中的双闭环是什么意思_STM32 TALK | 无感FOC方案原理机器控制难点分析...
- CF Round231C (ZWJ 神构造)
热门文章
- 5.Shell 编程从入门到精通 --- 基本文本处理
- 7.上传自己的代码到 composer
- 5. CSS 类选择器
- 循序渐进之Spring AOP(6) - 使用@Aspect注解
- java-spark的各种常用算子的写法
- Webpack 2 视频教程 020 - Webpack 2 中的 HMR ( Hot Module Replacement )
- golang+linux+pipline
- NBOOT分析-NBOOT.c(2)
- Struts2中的ValueStack类
- 虚拟机开机时出现Press ESC in 5 seconds to skip startup.nsh, any other key to continue问题的解决办法