在Java中,所有的类都继承自Object类,它是所有的始祖,但是我们不需要显示的书写extends Object.

equals方法

在JDK中,Object类的equals方法的实现如下:

public boolean equals(Object obj) {

return (this == obj);

}

就是简单的比较两个是否是引用的同一个对象即可。然而在工程中我们需要重新实现equals方法。

Java语言规范中要求equals方法需要符合以下要求:

自反性:对于任何的非空引用x,都有x.equals(x)返回true;

对称性:如果x.equals(y) == true, 那么y.equals(x) == true;

传递性:如果x.equals(y) == true, y.equals(z) == true,那么x.equals(z) == true;

一致性:如果x,y开始比较为true,在引用没有变化情况下,反复调用也为true;

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

但是在继承层次中的两个对象判断是否相等却比较麻烦,因为涉及到类型的转换。

如何才能编写完美的equals方法呢:

显式参数命名为 otherObject, 稍后需要将它强制转换成另一个叫做 other 的变量。

检测 this 与 otherObject 是否引用同一个对象:

if(this == otherObject) return true;

检测 otherObject 是否为 null , 如 果 为 null , 返 回 false。 这项检测是很必要的。

if(otherObject == null) return false;

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

if(getClass() != otherObject.getClass()) return false;

如果所有的子类都拥有统一的语义, 就使用 instanceof 检测:

if(!(otherObject instanceof ClassName)) return false;

转换为对应的类型变量:

ClassName other = (ClassName) otherObject;

开始比较对象中的每个属性,基本数据类型使用"=="判断,引用数据类型使用equals方法判断。

hashCode方法

散列码(hashCode)是由对象导出的一个整数值,hashCode是没有规律的。hashCode定义在Object类中,因此每个对象都有自己的hashCode,其值为对象的存储地址:

public native int hashCode();

如果在程序中重新定义了equals方法,那么就需要同时定义hashCode方法;方便用户将对象插入到Hash表中。

如何重新定义hashCode方法

hashCode方法应该返回一个整型数值(可以是负数),合理地利用各个属性的hashCode,以便让该对象产生的hashCode更加均匀。

@Override

public int hashCode() {

return name.hashCode() +

new Double(salary).hashCode() +

hreDate.hashCode();

}

更好的是可以避免null安全的方法Objects.hashCode方法,并使用各个属性:

@Override

public int hashCode() {

return Objects.hashCode(name)

+new Double(salary).hashCode() +

Objects.hashCode(hreDate);

}

直接针对各个属性值调用Objects.hash方法:

@Override

public int hashCode() {

return Objects.hash(name, salary, hreDate);

}

如果存在数组类型的属性,那么可以使用静态的Arrays,hashCode方法计算散列值,该散列值由数组的各个元素组成。

hashCode与equals方法的一致性

equals与hashCode的定义必须一致,如果x.equals(y) 返回true,那么x.hashCode与y.hashCode必须返回相同的值。

比如在Employee类中,equals方法比较的是ID,那么hashCode散列的时候也应该使用ID,而不是name或者salary。

java中的祖先类_Java程序公共祖先类-Object相关推荐

  1. java 启动类_java程序启动,类的加载情况

    一.java程序运行的时候,不是所有类必须被加载到jvm虚拟机中才可以正常使用 是不是所有的class文件都在启动的时候全部加载呢? java中的类大致分为三种:  1.系统类 2.扩展类 3.由程序 ...

  2. java中jframe是什么_java中JFrame是什么

    在java中,JFrame是官方提供的一个类,这个类的主要功能是使用该类可以快速的开发出Java界面应用程序(c/s架构),属于java.swing知识体系:它是屏幕上window的对象,能够最大化. ...

  3. java中api是什么_java中API总结

    1.什么是API? 可以理解为Java自己提供的标准类库,开发人员可直接使用其方法, 而不用进行源码实现.如常用的打印方法:System.out.println();,这是Java自己提供的东西. 官 ...

  4. java中的集合框架_JAVA中的集合框架(上)List

    第一节 JAVA中的集合框架概述 集合的概念,现实生活中:很多事物凑在一起就是一个集合:数学中的集合:具有相同属性事物的总体:JAVA中的集合:是一种工具类,就像是容器,储存任意数量的具有共同属性的对 ...

  5. 寻找二叉树中两个结点的最近公共祖先

    寻找二叉树中两个结点的最近公共祖先(这两个结点一定在树中) 对于二叉树中两个结点的最近公共祖先来说 ,这两个结点分别在自己的左子树和右子树中,所以要寻找二叉树中两个结点的最近公共祖先可以: 从根结点开 ...

  6. java中使用jxl导出excel表格的工具类(全网唯一亲测可用,在原来基础上扩展)

    java中后台导出excel的话,有两种方案,一是使用poi(不过由于是windows版本的,存在不兼容,但功能更多,更强大),而是使用jxl(纯java编写,不过兼容,简单一些),可以设置输出的ex ...

  7. 微信小程序电商源码:外卖小程序,电商小程序,门店类小程序,展示类小程序,批发商城小程序、分销小程序。

    介绍: 1.naicha 2.xianhua 3.xingbake 4.zhubaoxiao 5.zhubaoxiao 6.majiangshangcheng 7.jiafang 8.huazhuan ...

  8. java程序分为哪两大类_JAVA程序基础(第1-2章分类)复习-1

    JAVA基础理论辅助消化练习题 (蓝色的不做) 练习一(类java程序) 1.J ava是低级语言还是高级语言? 2.J ava是面向对象的程序设计语言吗? 3. J ava是编译型的计算机语言还是解 ...

  9. java中怎样定义实数_Java Math 类中的新功能,第 1 部分: 实数

    在这篇由两部分组成的文章中,Elliotte Rusty Harold 与您一起探讨经典 java.lang.Math 类中的"新"功能.第 1 部分主要讨论比较单调的数学函数.第 ...

最新文章

  1. 当谈论迭代器时,我谈些什么?
  2. 中文版GPT-3来了?智源研究院发布清源 CPM —— 以中文为核心的大规模预训练模型...
  3. 前端三十三:表单form
  4. 一、把握 Netty 整体架构脉络
  5. DJANGO里让用户自助修改邮箱地址
  6. centos 安装mysql 5.7.9_CentOS 6.6下RPM方式安装MySQL 5.7.9
  7. 上海计算机一级考试2017,2017年上海计算机一级考试试题
  8. nvidia refelx_AMD这么猛?!NVIDIA三款新卡胎死腹中
  9. [Easyui - Grid]为easyui的datagrid、treegrid增加表头菜单,用于显示或隐藏列
  10. 【tf.keras.Model】构建模型小结(部分问题未解决)
  11. android自定义View之自定义可置顶ScrollView,View滑动原理简析
  12. 360怎么看电脑配置_电脑配置清单速查表-AMD
  13. unity打包出来的exe带有dll文件
  14. 1.4 px30驱动移植-网卡驱动找不到网卡解决
  15. 纯净网站导航纯html无后台,仿360网址导航源码纯html页面无后台易操作修改无加密有留言后台...
  16. BPEL和XPDL的区别
  17. # 机械设备故障的靶向迁移诊断与OpenAI分析
  18. 符合信创的政务部门的OA办公系统?用开源平台来搭建一个吧!
  19. vue输入查询内容但不查询,切页刷新表格会出现触发查询的不合理情况
  20. spring-rabbit的使用

热门文章

  1. 微软亚洲研究院资深专家、IEEE Fellow帮助您深入细致地学习网络传播模型和算法啦!...
  2. 作者:夏帆(1988-),男,华东师范大学计算机科学与软件工程学院博士后。...
  3. 移动应用开发——作业3
  4. 【C语言】第一章 计算机及程序设计概述 题解
  5. 【计算机网络】传输媒体与物理层概念辨析
  6. 【数据结构与算法】顺序表V3.0的Java实现
  7. [Catalan]求解随机出栈可能数(洛谷P1044题题解,Java语言描述)
  8. 02 typedef
  9. Spring-Boot (四) 集成Spring Security
  10. loadrunner 参数化