Java-对象相等判断
Java-对象相等判断
- 引用相等性和对象相等性
- 引用相等性
- 对象相等性
- equals和hashCode
- equals
- JDK中说明了实现equals()方法应该遵守的约定:
- hashCode
- hash码相同的情况
- hash码不相同的情况
- JDK中对hashCode()方法的作用,以及实现时的注意事项做了说明:
- 重写equals和hashCode例子
引用相等性和对象相等性
引用相等性
两个引用指向堆上同一个对象,成为引用相等
对象相等性
堆上两个对象使用equals方法+hashCode方法 都为true时 认为两个对象是相等的
if (a.equals(b) && a.hashCode() == b.hashCode()) {// 两个引用指向同一个对象或者两个对象是相等的
}
equals和hashCode
equals
java中所有的类都集成自Object类,Object对equals方法的实现如下
public boolean equals(Object obj) {return (this == obj);}
因此在未对Object的equals方法做覆盖的时候,equals方法和"=="是相同的效果
equals通常用来比较两个对象的内容是否相等
==用来比较两个对象的地址是否相等。
JDK中说明了实现equals()方法应该遵守的约定:
1)自反性:x.equals(x)必须返回true。
2)对称性:x.equals(y)与y.equals(x)的返回值必须相等。
3)传递性:x.equals(y)为true,y.equals(z)也为true,那么x.equals(z)必须为true。
4)一致性:如果对象x和y在equals()中使用的信息都没有改变,那么x.equals(y)值始终不变。
5)非null:x不是null,y为null,则x.equals(y)必须为false。
hashCode
hashCode()在哈希表里面起作用,在往哈希表中(HashSet,HashMap)插入数据的时候,会先调用hashCode方法计算Object哈希码,使用这个哈希码来确定此对象在哈希表中的位置
hash码相同的情况
hash码相同时,再调用equals方法判断内容是否相同,如果相同,则认为是同一个对象,不再存储
hash码不相同的情况
hash码不相同,就分布在不同hash桶内
这就证明了,在hash表中,只要equals方法返回true,则hashcode一定相同,反过来则不一定,hashcode相同,equals为false,则元素在同一个hash桶内
JDK中对hashCode()方法的作用,以及实现时的注意事项做了说明:
1)hashCode()在哈希表中起作用,如java.util.HashMap。
2)如果对象在equals()中使用的信息都没有改变,那么hashCode()值始终不变。
3)如果两个对象使用equals()方法判断为相等,则hashCode()方法也应该相等。
4)如果两个对象使用equals()方法判断为不相等,则不要求hashCode()也必须不相等;但是开发人员应该认识到,不相等的对象产生不相同的hashCode可以提高哈希表的性能。
重写equals和hashCode例子
@Overridepublic boolean equals(Object another) {if (this == another) {return true;}if (another instanceof Person) {Person anotherPerson = (Person) another;if (this.getName().equals(anotherPerson.getName()) && this.getAge() == anotherPerson.getAge()) {return true;} else {return false;}}return false;}@Overridepublic int hashCode() {int hash = 17;hash = hash * 31 + getName().hashCode();hash = hash * 31 + getAge();return hash;}
Java-对象相等判断相关推荐
- java 对象流判断文件末尾 ( end of file / eof异常处理 )
文章目录 一. 以集合为对象读写文件 ( 最优解 ) 二. 写入空值作为文件结尾标志, 读到null终止 三. 处理 EOFException 时继续编码 一. 以集合为对象读写文件 ( 最优解 ) ...
- java 对象转json,java首字母小写,判断方法是否为javabean方法
将java对象转成json可用的类库很多,知名的有fastjson,jackson等,今天在做项目的时候发现项目没有上述依赖,用的是google的gson,因此封装方法将java对象转成gson代表的 ...
- 判断Java 对象实例是否死亡
垃圾收集器与内存分配策略参考目录: 1.判断Java 对象实例是否死亡 2. Java 中的四种引用 3.垃圾收集算法 4. Java9中的GC 调优 5.内存分配与回收策略 在进入主题之前,我们要先 ...
- Java的if判断对象为null时,null放在比较运算符的左边还是右边较好?
如java中:if(name == null)和if(null == name)有什么讲究吗? 答:在java里面,它们是一样的.但是通常写为null == name.这其实是在C语言里面引申出来的. ...
- java 确定对象的引用_JVM学习笔记之了解对象存活判断和4种引用【三】
垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还"存活"着,哪些已经"死去" 一.对象存活判断 1.1 引用计数算法(Reference Co ...
- Java基础- 对象相等判断
hashCode equals == 对象相等判断 equals和==区别 hashCode 与 equals(重要) ※※ hashCode()介绍 hashCode()介绍(常见的几个问题) 为什 ...
- java 对象为空判断_java中判断对象是否为空的方法
判断Java对象是否为null的方法: 首先,直接使用 object == null 去判断,对象为null的时候返回true,不为null的时候返回false.然后,在object != null ...
- 生存还是死亡 —— Java虚拟机如何判断对象是否需要回收
带着问题阅读 Java的内存区域中,有哪些区域是垃圾收集器所关注的? 怎么判断一个对象是不是需要回收? 导语 前面两讲,给大家讲解了Java的内存区域和常见的内存溢出异常,从这一讲开始,我们来学习Ja ...
- 理解Java对象:要从内存布局及底层机制说起,话说....
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 前言 大家好,又见面了,今天是JVM专题的第二篇文章,在上 ...
- JAVA对象转为Java String的几种常用方法
在java项目的实际开发和应用中,常常需要用到将对象转为String这一基本功能.本文将对常用的转换方法进行一个总结.常用的方法有Object#toString(),(String)要转换的对象,St ...
最新文章
- python为什么运行慢_为什么你写的Python运行的那么慢呢?
- python实现表格_零基础小白怎么用Python做表格?
- 使用静态库.framework注意事项
- redhat搭建php环境,rhel5搭建PHP5.2.6+apache2.2.9开发环境(模块全)
- dart系列之:在dart中使用数字和字符串
- python3 unicode字符串_【已解决】Python3中如何声明字符串是unicode类型以避免log日志打印出错...
- python pd Series 添加行_Python数据分析与挖掘的常用工具
- MFC - CStdioFile 读取txt文件UNICODE 中文异常
- paip.python错误解决9
- STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.
- Ubuntu下载依赖包
- 权重股启动意味着什么
- 该怎么标注建筑图纸后进行保存?
- iOS逆向(7)-LLDB,自制LLDB脚本,窜改微信红包金额
- android手表微信运动,oppo智能手表微信运动如何安装
- 可怕!Facebook 竟能识别出性工作者!你怎么看?
- lf模型下声门脉冲matlab程序,数字语音处理及MATLAB仿真.rar第二章
- 让你的应用完美适配平板
- 一眼就能看懂的Android自学手册,深度好文
- C语言%lld、%llu无法正常输出比long long长整数小的数