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-对象相等判断相关推荐

  1. java 对象流判断文件末尾 ( end of file / eof异常处理 )

    文章目录 一. 以集合为对象读写文件 ( 最优解 ) 二. 写入空值作为文件结尾标志, 读到null终止 三. 处理 EOFException 时继续编码 一. 以集合为对象读写文件 ( 最优解 ) ...

  2. java 对象转json,java首字母小写,判断方法是否为javabean方法

    将java对象转成json可用的类库很多,知名的有fastjson,jackson等,今天在做项目的时候发现项目没有上述依赖,用的是google的gson,因此封装方法将java对象转成gson代表的 ...

  3. 判断Java 对象实例是否死亡

    垃圾收集器与内存分配策略参考目录: 1.判断Java 对象实例是否死亡 2. Java 中的四种引用 3.垃圾收集算法 4. Java9中的GC 调优 5.内存分配与回收策略 在进入主题之前,我们要先 ...

  4. Java的if判断对象为null时,null放在比较运算符的左边还是右边较好?

    如java中:if(name == null)和if(null == name)有什么讲究吗? 答:在java里面,它们是一样的.但是通常写为null == name.这其实是在C语言里面引申出来的. ...

  5. java 确定对象的引用_JVM学习笔记之了解对象存活判断和4种引用【三】

    垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还"存活"着,哪些已经"死去" 一.对象存活判断 1.1 引用计数算法(Reference Co ...

  6. Java基础- 对象相等判断

    hashCode equals == 对象相等判断 equals和==区别 hashCode 与 equals(重要) ※※ hashCode()介绍 hashCode()介绍(常见的几个问题) 为什 ...

  7. java 对象为空判断_java中判断对象是否为空的方法

    判断Java对象是否为null的方法: 首先,直接使用 object == null 去判断,对象为null的时候返回true,不为null的时候返回false.然后,在object != null ...

  8. 生存还是死亡 —— Java虚拟机如何判断对象是否需要回收

    带着问题阅读 Java的内存区域中,有哪些区域是垃圾收集器所关注的? 怎么判断一个对象是不是需要回收? 导语 前面两讲,给大家讲解了Java的内存区域和常见的内存溢出异常,从这一讲开始,我们来学习Ja ...

  9. 理解Java对象:要从内存布局及底层机制说起,话说....

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 前言 大家好,又见面了,今天是JVM专题的第二篇文章,在上 ...

  10. JAVA对象转为Java String的几种常用方法

    在java项目的实际开发和应用中,常常需要用到将对象转为String这一基本功能.本文将对常用的转换方法进行一个总结.常用的方法有Object#toString(),(String)要转换的对象,St ...

最新文章

  1. python为什么运行慢_为什么你写的Python运行的那么慢呢?
  2. python实现表格_零基础小白怎么用Python做表格?
  3. 使用静态库.framework注意事项
  4. redhat搭建php环境,rhel5搭建PHP5.2.6+apache2.2.9开发环境(模块全)
  5. dart系列之:在dart中使用数字和字符串
  6. python3 unicode字符串_【已解决】Python3中如何声明字符串是unicode类型以避免log日志打印出错...
  7. python pd Series 添加行_Python数据分析与挖掘的常用工具
  8. MFC - CStdioFile 读取txt文件UNICODE 中文异常
  9. paip.python错误解决9
  10. STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.
  11. Ubuntu下载依赖包
  12. 权重股启动意味着什么
  13. 该怎么标注建筑图纸后进行保存?
  14. iOS逆向(7)-LLDB,自制LLDB脚本,窜改微信红包金额
  15. android手表微信运动,oppo智能手表微信运动如何安装
  16. 可怕!Facebook 竟能识别出性工作者!你怎么看?
  17. lf模型下声门脉冲matlab程序,数字语音处理及MATLAB仿真.rar第二章
  18. 让你的应用完美适配平板
  19. 一眼就能看懂的Android自学手册,深度好文
  20. C语言%lld、%llu无法正常输出比long long长整数小的数

热门文章

  1. 窗口置顶工具v1.1.0
  2. mysql diff函数_MYSQL中 的datediff、timestampdiff函数
  3. java工资管理系统(java员工工资管理系统)
  4. 网络安全等级保护与分级保护指导案例
  5. html文件bak,轻松解包MIUI小米备份bak文件 还原出明文数据
  6. 小米黑苹果安装资料收集
  7. 乔布斯去世衍生多种周边产品(支持乔布斯请顶)
  8. 华为云计算01——虚拟化技术
  9. 使用 Unity 和 C 开发您的首个游戏
  10. IPMSM永磁电机弱磁控制 附有说明文档 公式法MTPA