Java的常用类库——java.util.Objects

本文详细介绍了Java中的Objects类,对比了Objects与Object的区别,解析了Objects类中的核心方法,如equals、deepEquals、requireNonNull等,强调了它们在空指针安全和参数校验上的优势,并给出了相关源码分析和示例。Objects类是Java 7引入的工具类,提供了实用的静态方法,简化了对象比较和验证的过程。
摘要由CSDN通过智能技术生成

Objects 与 Object 区别

Object 是 Java 中所有类的基类,位于java.lang包。所有对象(包括数组)都实现此类的方法。

Objects 【public final class Objects extends Object】是 Object 的工具类,位于java.util包。它从jdk1.7开始才出现,被final修饰不能被继承,拥有私有的构造函数。

此类包含static实用程序方法,用于操作对象或在操作前检查某些条件。 这些实用程序包括 null 或 null方法 ,用于计算对象的哈希代码返回对象的字符串比较两个对象,以及检查索引子范围值是否超出范围
在这里插入图片描述

Objects 方法介绍与分析

在这里插入图片描述

1、equals

equals方法 指某个其他对象是否“等于”此对象。(判断两个对象是否相等)

equals方法在非null对象引用上实现等价关系:

  • 自反性 :对于任何非空的参考值x , x.equals(x)应该返回true 。
  • 对称性 :对于任何非空引用值x和y , x.equals(y)应该返回true当且仅当y.equals(x)回报true 。
  • 传递性 :对于任何非空引用值x , y和z ,如果x.equals(y)回报true个y.equals(z)回报true,然后x.equals(z)应该返回true 。
  • 一致性 :对于任何非空引用值x和y ,多次调用x.equals(y)始终返回true或始终返回false,前提是未修改对象上的equals比较中使用的信息。
  • 对于任何非空的参考值x , x.equals(null)应该返回false 。

在比较两个对象的时候,Object.equals方法容易抛出空指针异常

首先我们来看看在Object类中定义的equals方法 [源码] ↓
在这里插入图片描述
可以看到其源码,在Object类型的equals方法是直接通过== 来比较的,和 ==是没有任何区别的。【故我们通常会重写Object类的equals方法】

请注意,Object类 通常需要在重写此方法时覆盖hashCode方法,以便维护hashCode方法的常规协定,该方法声明相等对象必须具有相等的哈希代码。

a、使用对象的equals方法(Object) 在这里插入图片描述
运行结果:
在这里插入图片描述
所以,对于Object类,则“字符串常量与变量对象比较的时候,常量要写在equals外边,变量放在equals()括号里边。”就是这个原因。如果是两个变量比较的时候,就都需要加非空判断。

b、使用Objects中的equals方法
在这里插入图片描述
这里是引用
注意理解这两个对象,这两个对象都不指向任何地址,也可以理解为都是一个“空指针”【null是没有内存空间的】。

现在,Objects.equals方法中已经做了非空判断,所以不会抛出空指针异常,它是null-save空指针安全的,而且也可以简化代码。

源码如下:
在这里插入图片描述
解释:可以比较两个基本数据类型的数值是否相等,而equals方法依旧调用的是Object对象中的方法,比较两个Object对象的地址值是否引用的同一块地址【因为由Object类的equals方法的源码可以看出实际上就是“==”的比较】,如果不同则为false。

2、deepEquals

顾名思义,深度比较两个对象。
如果两个对象是深层相等,那返回true,否则返回false。

当参数是数组对象,其方法内部采用的是Arrays.deepEquals0方法的算法。

使用Objects.deepEquals方法有个好处,当我们在写业务代码时,可以直接使用此方法来判断两个复杂类型,比如使用了泛型的列表对象List、或者通过反射得到的对象,不清楚对象的具体类型。

源码如下:
在这里插入图片描述
解释:Objects中还有一个deepEquals(Object x,Object y)的方法,此方法的功能比较强大,不仅可以比较数值是否相同,而且还可以比较两个对象中的内容是否相同,如果相同即为true

简短的说明下Arrays.deep

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

涛涛同学debug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值