java中的祖先类_Java程序公共祖先类-Object
在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相关推荐
- java 启动类_java程序启动,类的加载情况
一.java程序运行的时候,不是所有类必须被加载到jvm虚拟机中才可以正常使用 是不是所有的class文件都在启动的时候全部加载呢? java中的类大致分为三种: 1.系统类 2.扩展类 3.由程序 ...
- java中jframe是什么_java中JFrame是什么
在java中,JFrame是官方提供的一个类,这个类的主要功能是使用该类可以快速的开发出Java界面应用程序(c/s架构),属于java.swing知识体系:它是屏幕上window的对象,能够最大化. ...
- java中api是什么_java中API总结
1.什么是API? 可以理解为Java自己提供的标准类库,开发人员可直接使用其方法, 而不用进行源码实现.如常用的打印方法:System.out.println();,这是Java自己提供的东西. 官 ...
- java中的集合框架_JAVA中的集合框架(上)List
第一节 JAVA中的集合框架概述 集合的概念,现实生活中:很多事物凑在一起就是一个集合:数学中的集合:具有相同属性事物的总体:JAVA中的集合:是一种工具类,就像是容器,储存任意数量的具有共同属性的对 ...
- 寻找二叉树中两个结点的最近公共祖先
寻找二叉树中两个结点的最近公共祖先(这两个结点一定在树中) 对于二叉树中两个结点的最近公共祖先来说 ,这两个结点分别在自己的左子树和右子树中,所以要寻找二叉树中两个结点的最近公共祖先可以: 从根结点开 ...
- java中使用jxl导出excel表格的工具类(全网唯一亲测可用,在原来基础上扩展)
java中后台导出excel的话,有两种方案,一是使用poi(不过由于是windows版本的,存在不兼容,但功能更多,更强大),而是使用jxl(纯java编写,不过兼容,简单一些),可以设置输出的ex ...
- 微信小程序电商源码:外卖小程序,电商小程序,门店类小程序,展示类小程序,批发商城小程序、分销小程序。
介绍: 1.naicha 2.xianhua 3.xingbake 4.zhubaoxiao 5.zhubaoxiao 6.majiangshangcheng 7.jiafang 8.huazhuan ...
- java程序分为哪两大类_JAVA程序基础(第1-2章分类)复习-1
JAVA基础理论辅助消化练习题 (蓝色的不做) 练习一(类java程序) 1.J ava是低级语言还是高级语言? 2.J ava是面向对象的程序设计语言吗? 3. J ava是编译型的计算机语言还是解 ...
- java中怎样定义实数_Java Math 类中的新功能,第 1 部分: 实数
在这篇由两部分组成的文章中,Elliotte Rusty Harold 与您一起探讨经典 java.lang.Math 类中的"新"功能.第 1 部分主要讨论比较单调的数学函数.第 ...
最新文章
- 当谈论迭代器时,我谈些什么?
- 中文版GPT-3来了?智源研究院发布清源 CPM —— 以中文为核心的大规模预训练模型...
- 前端三十三:表单form
- 一、把握 Netty 整体架构脉络
- DJANGO里让用户自助修改邮箱地址
- centos 安装mysql 5.7.9_CentOS 6.6下RPM方式安装MySQL 5.7.9
- 上海计算机一级考试2017,2017年上海计算机一级考试试题
- nvidia refelx_AMD这么猛?!NVIDIA三款新卡胎死腹中
- [Easyui - Grid]为easyui的datagrid、treegrid增加表头菜单,用于显示或隐藏列
- 【tf.keras.Model】构建模型小结(部分问题未解决)
- android自定义View之自定义可置顶ScrollView,View滑动原理简析
- 360怎么看电脑配置_电脑配置清单速查表-AMD
- unity打包出来的exe带有dll文件
- 1.4 px30驱动移植-网卡驱动找不到网卡解决
- 纯净网站导航纯html无后台,仿360网址导航源码纯html页面无后台易操作修改无加密有留言后台...
- BPEL和XPDL的区别
- # 机械设备故障的靶向迁移诊断与OpenAI分析
- 符合信创的政务部门的OA办公系统?用开源平台来搭建一个吧!
- vue输入查询内容但不查询,切页刷新表格会出现触发查询的不合理情况
- spring-rabbit的使用
热门文章
- 微软亚洲研究院资深专家、IEEE Fellow帮助您深入细致地学习网络传播模型和算法啦!...
- 作者:夏帆(1988-),男,华东师范大学计算机科学与软件工程学院博士后。...
- 移动应用开发——作业3
- 【C语言】第一章 计算机及程序设计概述 题解
- 【计算机网络】传输媒体与物理层概念辨析
- 【数据结构与算法】顺序表V3.0的Java实现
- [Catalan]求解随机出栈可能数(洛谷P1044题题解,Java语言描述)
- 02 typedef
- Spring-Boot (四) 集成Spring Security
- loadrunner 参数化