前言

Object类是Java中所有类的始祖,在Java中每个类都扩展了Object。如果没有明确地指出超类,Object就被认为是这个类的超类。由于在Java中每个类都是由Object类扩展而来的,所以熟悉这个类提供的所有服务十分重要。

equals方法

equals方法用于检测一个对象是否等于另外一个对象。在Object类中,equals方法比较的是两个对象的地址值,地址值相同返回true,否则返回false,以下是其源码:

public boolean equals(Object obj) {
return (this == obj);
}

==运算符的使用:对于基本数据类型,其比较的是对象的数值;对于引用数据类型,其比较的是对象的地址值。

重写equals方法

在Object类中,equals方法比较的是两个对象的地址值,然而这样的比较意义不大,我们更希望根据两个对象的属性值是否相同来判断这两个对象是否“相等”,因此我们在自己创建对象时需要重写equals方法,以下是自己创建的Employee类中的具体重写代码:

public class Employee {
private String name;
private double salary;
private LocalDate hireDay; // 重写equals方法,传入Object对象
public boolean equals(Object otherObject) {
// 若参与比较的两个对象是同一个对象(地址值相同),直接返回true,只是为了提高代码执行效率
if (this == otherObject) {
return true;
} // 判断非空
if (otherObject == null) {
return false;
} // 判断2个对象是否属与同一个类
if (getClass() != otherObject.getClass()) {
return false;
} // 将Object类型强转成Employee类
Employee other = (Employee) otherObject; // 返回对象是否相等的结果
return Objects.equals(name, other.name) && salary == other.salary && Objects.equals(hireDay, other.hireDay);
}
}

objects.equals()

在重写equals方法的最后使用了Objects.equals()函数,Objects类是JDK7之后添加的一个工具类,它提供了一些方法来操作对象,它由一些静态的实用方法组成,这些方法是空指针安全的,其中Objects.equals()就是为了防止Object.equals()中容易出现空指针异常的现象

源码如下:

public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}

编写equals方法的建议

  1. 显示参数命名为otherObject,稍后需要将它强制转换成另一个名为other的变量
  2. 检测thisotherObject是否相等:
if (this == otherObject) return true;

  这条语句只是一个优化。实际上,这是一种经常采用的形式。因为检查身份要比逐个比较字段开销小。

  1. 检测otherObject是否为null,如果为null,返回false。这项检测是很有必要的。
if (this == otherObject) return false;
  1. 比较this与otherObject的类。如果equals的语义可以在子类中改变,就使用getClass检测
if (getClass() != otherObject.getClass()) return false;

  如果所有的子类都有相同的相等性语义,可以使用instanceof检测

if (!(otherObject instanceof ClassName)) return false;
  1. 将otherObject强制转换为相应类类型的变量:
ClassName other = (ClassName) otherObject
  1. 根据相等性概念的要求来比较字段。使用==比较基本类型字段,使用Objects.equals比较对象字段。如果所有的字段都匹配,就返回true;否则返回false。

    如果子类中重新定义equals,就要在其中包含一个super.equals(other)调用

hashCode

散列码(hash code)是由对象导出的一个整型值。散列码是没有规律的。如果x和y是两个不同的对象,x.hashCode()y.hashCode()基本上不会相同。

如果重新定义了equals方法,就必须为用户可能插入散列表的对象重新定义hashCode方法

hashCode方法应该返回一个整数(也可以是负数),并且equals与hashCode的定义必须相容:如果x.equals(y)发那会true,那么x.hashCode()就必须与y.hashCode()返回相同的值。例如,如果定义Employee.equals比较员工的ID,那么hashCode方法就需要散列ID,而不是员工的姓名或存储地址。

toString

在Object中有一个重要的方法,就是toString方法,它会返回表示对象值的一个字符串。默认打印的是类名+哈希编码的形式,由于这种形式正常人看不懂,所以我们需要重写这个方法,打印一些容易看都懂的描述信息。

一般调用方法有2种:

  • 当一个引用对象和字符串作连接的时候,会自动调用toString方法
  • 直接打印引用对象

如果类中没有toString方法,又由于Object类是所有类的超类,所以我们会调用Object中的toString方法,但是默认的打印格式是:类名+哈希编码,所以我们需要重写toString方法,最后这里强烈建议为自定义的每一个类添加toString方法

Java(15)Object类的更多相关文章

  1. Java面向对象 Object类 内部类

     Java面向对象 Object类    内部类 知识概要:                 一:Object类                 二:内部类 匿名内部类的写法 1.Object O ...

  2. Java之Object类和常用的API

    Object类和常用的API 学习过程中的笔记,涉及到Objetc中的equals方法和toString方法,日期类Date,日历类Calendar,日期格式化类SimpleDateFormat以及基 ...

  3. Java中Object类hashCode的底层实现

    Java中Object类hashCode的底层实现 openjdk\jdk\src\share\native\java\lang\Object.c 42 static JNINativeMethod ...

  4. Java 之 Object 类

    一.Object 概述  java.lang.Object 类是 Java 语言中的根类,即所有类的父类. 在对象实例化的时候,最终找的父类就是 Object. 如果一个类没有特别指定父类,那么默认则 ...

  5. Java之Object类用法总结

    Object类概述: 1.Object类是所有Java类的根父类. 2.如果在类的声明中未使用extends关键字指明其父类, 则默认父类为java.lang.Object类. Object类主要结构 ...

  6. java.lang.Object类与equals()及toString()的使用

    1.Object类是所有Java类的根父类 2.如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类 3.Object类中的功能(属性.方法)就具有通用 ...

  7. 【Java基础之Object类(一)】Java中Object类中的所有方法(toString、equals、hashCode、clone、finalize、wait和notify等)详解(转载)

    java中的hashcode.equals和toString方法都是基类Object的方法. 首先说说toString方法,简单的总结了下API说明就是:返回该对象的字符串表示,信息应该是简明但易于读 ...

  8. JDK1.8源码(一)——java.lang.Object类

    本系列博客将对JDK1.8版本的相关类从源码层次进行介绍,JDK8的下载地址. 首先介绍JDK中所有类的基类——java.lang.Object. Object 类属于 java.lang 包,此包下 ...

  9. java.lang.Object类

    Object类是java所有对象的基类,包含着java最核心和最基础的类,在编译时会自动导入.具体的类结构图: 1.构造器 public Object(); 大部分情况下,Java中通过形如 new ...

  10. Java:Object类详解

    Java的一些特性会让初学者感到困惑,但在有经验的开发者眼中,却是合情合理的.例如,新手可能不会理解Object类.这篇文章分成三个部分讲跟Object类及其方法有关的问题. 上帝类 问:什么是Obj ...

随机推荐

  1. Java代码优化的30个小技巧

    前言 我之前写过两篇关于优化相关的问题:<聊聊sql优化的15个小技巧>和<聊聊接口性能优化的11个小技巧>,发表之后,在全网受到广大网友的好评.阅读量和点赞率都很高,说明了这 ...

  2. Elasticsearch的cmd窗口乱码问题(windows)

    elasticsearch 7.6.0 windows版日志乱码问题解决 修改jvm.options,如何重启es即可 新增 -Dfile.encoding=GBK

  3. 开源有魔力 - DolphinScheduler 的 Apache 之路

    关于 Apache DolphinScheduler社区 Apache DolphinScheduler(incubator) 于17年在易观数科立项,19年3月开源, 19 年8月进入Apache ...

  4. javaScript 事件循环机制

    JavaScript是单线程的编程语言,只能同一时间内做一件事.但是在遇到异步事件的时候,js线程并没有阻塞,还会继续执行,这就是因为JS有事件循环机制. 事件循环流程总结 主线程开始执行一段代码, ...

  5. thinkphp 5 及一下或php项目里实现模糊查询

    想在thinkPHP或者PHP项目实现模糊查询怎么实现呢? 今天在网上搜了一下用 mysql里的 like 就可以实现 怎么用呢? 看代码: 错误用法: where('title','like',$s ...

  6. 开源图编辑库 NebulaGraph VEditor 的设计思路分享

    本文首发于 NebulaGraph 公众号 NebulaGraph VEditor 是一个拥有高性能.高可定制的所见即所得图可视化编辑器前端库. NebulaGraph VEditor 底层基于 SV ...

  7. Mysql 实现数据库读写分离

    Amoeba+Mysql实现数据库读写分离 一.Amoeba 是什么 Amoeba(变形虫)项目,专注 分布式数据库 proxy 开发.座落与Client.DB Server(s)之间.对客户端透明. ...

  8. Excel 工作簿、工作表与单元格

    工作簿 工作簿是指在 Excel 中用来存储并处理数据的文件,其扩展名是.xlsx.工作簿是由工作表组成的,每一个工作簿都可以包含一个或多个工作表,默认为 3 个工作表.Excel 2007 之前的版 ...

  9. [CF1538G] Gift Set (数学简单题)

    题面 相信英文题面也很好理解 有 x \tt x x 个红糖, y \tt y y 个蓝糖.每一个礼包里面要么有 a \tt a a 个红糖+ b \tt b b 个蓝糖,要么是 a \tt a a ...

  10. MongoDB,入门看这一篇足矣!

    一.介绍 在介绍 MongoDB 之前,我先介绍一下业务开发的时候遇到的痛点,以便大家对它有一个更加清晰的认识! 最近在用数据库存储数据的时候发现这么一个坑,例如从消息队列中监听消息的时候,原来的做法 ...