Java中,只有8种基本类型不是对象,例如:4种整形类型(byte, short, int,long),2种浮点类型(flout, double),boolean, char不是对象,其他的所有类型,不论是对象数组,列表等都扩展了Object类.了解学习Object中方法的设计原理和实现方式有助于更好的学习理解java语言.下面,我们首先学习一下Object中的equals方法. 判断两个对象相等时,JVM首先查找两个对象的hashCode, 如果两者hashCode不同,则返回false;如果两者的hashCode相同,则调用equals方法进行比较.

Object中equals方法

Object中的equals方法用于检测一个对象是否等于另外一个对象. Object类中,判断两个对象是否引用同一个对象实现equals方法,源码如下:

实际处理中,若要比较两个对象是否相等,一般需要重写equals方法.

例1:雇员对象比较

如果两个雇员对象的姓名, 薪水和雇佣一样,就认为它们相等.重写equals方法如下:

注意,比较通过Objects中静态函数equals比较两个对象是否相等.该方法源码如下:

这样,当两个对象都为null时,返回true,例如,两个Employee对象的name都为null, 返回true; 如果第一个对象不为null,则调用a.equals(Object obj)方法

对象比较与继承

如果隐式和显式的对象所属类型不一致,equals方法该如何处理呢?在例1中,如果两个对象的类型不一致,直接返回false;多数程序员直接使用instanceof检测:

这样做不但没有解决继承子类的错误,还可能引发其他的一些错误,例1中,采用强制类型转换的方式.

要实现子类对象比较,先了解一下java规范中对equals方法的约束.

java规范中equals方法特征

自反性

对于任何非空引用x, x.equals(x) 返回true;

对称性

对于任何引用x, y, 当且仅当y.equals(x) 返回true, x.equals(y)返回true;

传递性

对于任何引用x, y, z, 若x.equals(y)返回true, y.equals(z)返回true; 则 x.equals(z)返回true;

一致性

若x和y引用的对象没有发生改变, 则反复调用x.equals(y)应该返回同样的结果.

对任意非空引用x, x.equals(null) 返回false;

下面可以通过两个不同的情况看待这个问题:

如果子类能够拥有自己的相等概念, 则对称性需求强制采用getClass进行检测

如果由超类决定相等的概念, 那么就用instanceof进行检测,这样可以在不用子类的对象之间进行相等的比较

注释:

在标准的java库中包含150多个equals方法的实现,包括instanceof检测, 调用getClass检测, 捕获ClassCastException检测或者什么都不做. 在java.sql.TimeStamp实现人员指出, Timestamp类继承Date类,而后者的equals方法使用了一个instanceof检测,这样重写equals方法时,就无法同时做到对称性.

在由超类决定相等时,可以考虑final关键字修改比较函数,若考虑到子类equals方法灵活性,可以不加修饰,例如AbstractSet.equals方法,应该申明为final, 这样就可以比较子类HashSet和TreeSet, 但是考虑到子类的灵活性,没有添加任何修饰.

编写equals方法的建议:

显示参数命名为otherObject, 稍后转化成other变量

检测this和otherObject是否是同一个对象的引用,是,返回true;

检测otherObject是否为null, 是, 返回false;

比较this和otherObject是否属于同一个类. 如果equals的语义在每个子类中有所改变,就使用getClass检测:

如果所以子类语义相同,使用instanceof检测:

将otherObject转化为相对应的类型变量other

对所需要的比较的数据域进行比较. 如果是基本数据类型,使用a==b比较; 如果是对象比较,调用Objects.equals(a, b)进行比较

整个流程可以参照例1;

常见equals方法实现错误

总结

以上就是本文关于重写Java中的equals方法介绍的全部内容,希望对大家有所帮助。有什么问题可以随时留言,小编会及时回复大家的。感谢朋友们对本站的支持!

原文链接:http://www.cnblogs.com/TinyWalker/p/4834685.html

java中equals函数所在的类,重写Java中的equals方法介绍相关推荐

  1. C++中类型转换函数:将当前类的类型转换为其它类型

    1.C++中类型转换函数:将当前类的类型转换为其它类型 转换构造函数能够将其它类型转换为当前类类型(例如将double类型转换为complex类型),但是不能反过来将当前类类型转换为其它类型(例如将c ...

  2. 帝国cms cj1.php,帝国cms源码中常用函数所在位置

    帝国cms源码中常用函数所在位置 发布时间:2014-03-28 15:00:26   作者:佚名   我要评论 帝国cms常用函数所在位置归总,使用帝国cms的朋友可以收藏下 帝国cms常用函数所在 ...

  3. c++学习笔记之基础---类内声明函数后在类外定义的一种方法

    在C++的"类"中经常遇到这样的函数, 返回值类型名 类名::函数成员名(参数表){ 函数体.} 双冒号的作用 ::域名解析符!返回值类型名 类名::函数成员名(参数表) { 函数 ...

  4. zeros什么意思_matlab中zeros函数是什么含义?MATLAB中zeros表示表示什么意思

    matlab中zeros函数是什么含义?MATLAB中zeros表示表示什么意思 发表时间:2019-12-26 10:20:18 小编:4326手游网 阅读: 在手机上看 手机扫描阅读 MATLAB ...

  5. 要绘图,首先得调整画笔,待画笔调整好之后,再将图像绘制到画布上,这样才可以显示在手机屏幕上。Android 中的画笔是 Paint类,Paint 中包含了很多方法对其属性进行设置,主要方法(没有全部列

    要绘图,首先得调整画笔,待画笔调整好之后,再将图像绘制到画布上,这样才可以显示在手机屏幕上.Android 中的画笔是 Paint类,Paint 中包含了很多方法对其属性进行设置,主要方法(没有全部列 ...

  6. php iconv 空格,PHP_PHP中iconv函数转码时截断字符问题的解决方法,iconv是转换编码的,但是在中 - phpStudy...

    PHP中iconv函数转码时截断字符问题的解决方法 iconv是转换编码的,但是在中文转码时候出现显示不全问题. iconv("UTF-8","GB2312//IGNOR ...

  7. 负载均衡SLB中开启会话保持并选择重写Cookie时的配置方法

    负载均衡SLB中开启会话保持并选择重写Cookie时的配置方法 KB: 27704 · 更新时间:2020-09-08 15:12:41 编辑 · 本页目录 概述 详细信息 更多信息 适用于 免责声明 ...

  8. Linux环境中堆栈和堆相关内存损坏的基本原理和调试方法介绍

    本文讲的是Linux环境中堆栈和堆相关内存损坏的基本原理和调试方法介绍, 前言 建议阅读本文之前,你对ARM组件的有个基本了解,本文会先为你介绍32位Linux环境中进程的内存布局,然后再介绍堆栈和堆 ...

  9. TIA博途S7-1200中实现高低字节或高低字调换的几种方法介绍

    TIA博途S7-1200中实现高低字节或高低字调换的几种方法介绍 例如S7-1200与某些上位机进行通信时,读写的浮点数的存储方式与上位机不同,即高低字或字节是相反的,此时读取的数据是不对的,需要将高 ...

最新文章

  1. 【转】读马化腾的产品设计观
  2. Openstack数据库初始化时为何要重复授权
  3. 指针应用-----链表二
  4. Linux——查看硬件配置命令
  5. 浅谈MVC设计模式和SSH框架的关系
  6. crm——stark组件核心原理
  7. 写cookies注意事项
  8. harmonyos消息服务器,第三方纯HarmonyOS应用太少,你还愿意升级吗?
  9. php设置用户头像,PHP针对多用户实现更换头像功能
  10. python的合法语句_Python练习2
  11. matlab 两点划线,matlab学习2-画线
  12. php curl 批量,关于用php的curl批量抓取内容
  13. k8s集群部署项目_JAVA项目(制作镜像)---K8S_Google工作笔记0060
  14. CPP 获取目录下的文件
  15. java毕业设计——基于java+JSP+MyEclipse的网上订餐系统设计与实现(毕业论文+程序源码)——网上订餐系统
  16. Kali Linux学习入门
  17. 网络前沿技术期末考题盘点
  18. 陈安之超级成功法则(1)
  19. java绘制五子棋棋盘
  20. Linux内核转储---Kdump,Crash使用介绍

热门文章

  1. Ext Ajax:如何调用Ext.Ajax.request方法和使用Java Servlet进行处理
  2. php curl http2,用php做ios http2推送服务遇到的坑
  3. iphone投屏_iPhone投屏电视机/投影仪用这个方法很简单,媲美华为PC模式
  4. java保持运行_保持Java程序无限运行的方法是有效的吗?
  5. php查询sql2008数据库操作系统,使用 PHP 进行查询 - Azure SQL Database SQL Managed Instance | Microsoft Docs...
  6. 设有n个正整数,将它们排成一排,组成一个最大的多位整数
  7. [蓝桥杯][历届试题]国王的烦恼(反向+并查集)
  8. P3258 [JLOI2014]松鼠的新家(树上点查分)
  9. 12. Excel数据可视化看板--动态销售月报看板
  10. c++ linux 线程等待与唤醒_C++ Linux线程同步机制:POSIX信号量,互斥锁,条件变量...