为什么不建议用 equals 判断对象相等?

简介: 一直以为这个方法是java8的,今天才知道是是1.7的时候,然后翻了一下源码。

一直以为这个方法是java8的,今天才知道是是1.7的时候,然后翻了一下源码。


这片文章中会总结一下与a.equals(b)的区别,然后对源码做一个小分析。


一,值是null的情况:

1.a.equals(b), a 是null, 抛出NullPointException异常。


2.a.equals(b), a不是null, b是null, 返回false


3.Objects.equals(a, b)比较时, 若a 和 b 都是null, 则返回 true, 如果a 和 b 其中一个是null, 另一个不是null, 则返回false。注意:不会抛出空指针异常。

image.png

1.源码

public final class Objects {
    private Objects() {
        throw new AssertionError("No java.util.Objects instances for you!");
    }
    /**
     * Returns {@code true} if the arguments are equal to each other
     * and {@code false} otherwise.
     * Consequently, if both arguments are {@code null}, {@code true}
     * is returned and if exactly one argument is {@code null}, {@code
     * false} is returned.  Otherwise, equality is determined by using
     * the {@link Object#equals equals} method of the first
     * argument.
     *
     * @param a an object
     * @param b an object to be compared with {@code a} for equality
     * @return {@code true} if the arguments are equal to each other
     * and {@code false} otherwise
     * @see Object#equals(Object)
     */
    public static boolean equals(Object a, Object b) {
        return (a == b) || (a != null && a.equals(b));
    }

2.说明

首先,进行了对象地址的判断,如果是真,则不再继续判断。


如果不相等,后面的表达式的意思是,先判断a不为空,然后根据上面的知识点,就不会再出现空指针。


所以,如果都是null,在第一个判断上就为true了。如果不为空,地址不同,就重要的是判断a.equals(b)。


四,“a==b”和”a.equals(b)”有什么区别?

如果 a 和 b 都是对象,则 a==b 是比较两个对象的引用,只有当 a 和 b 指向的是堆中的同一个对象才会返回 true。


而 a.equals(b) 是进行逻辑比较,当内容相同时,返回true,所以通常需要重写该方法来提供逻辑一致性的比较。

目录
相关文章
|
调度
Dataphin功能Tips系列(6)-月调度周期任务补数据的业务日期选择
一个销售额结算的周期任务的调度周期是月调度---每月1号进行调度,但是有一天调整了计算口径后希望重新计算过去几个月的销售额,此时补数据任务的业务日期应该如何选择?
316 4
Dataphin功能Tips系列(6)-月调度周期任务补数据的业务日期选择
|
前端开发 NoSQL JavaScript
常见接口和服务幂等性问题及解决方案
常见接口和服务幂等性问题及解决方案
818 0
|
存储 资源调度 Cloud Native
阿里云上云迁移工具案例实践:华为云迁移到阿里云
阿里云上云迁移工具案例实践:华为云迁移到阿里云
阿里云上云迁移工具案例实践:华为云迁移到阿里云
|
存储 安全 搜索推荐
hyperf-throttle-requests,一个超牛的 PHP 限流神器
`hyperf-throttle-requests` 是专为 Hyperf 框架设计的请求频率限流库,适用于分布式系统和微服务架构,能有效防止恶意攻击和流量高峰对后端服务的影响。通过限制用户在一定时间内的请求次数,确保服务的稳定性和可用性。该库支持注解、助手函数及直接调用三种使用方式,并提供了灵活的配置选项,如存储驱动、最大请求次数等。最新版已兼容 Hyperf 3.1 版本,安装简便,配置灵活,是保护后端服务的理想选择。
228 3
|
Cloud Native 持续交付 Docker
云原生技术入门与实践:Docker容器化部署示例
【9月更文挑战第25天】在数字化转型的浪潮下,云原生技术成为推动企业创新的重要力量。本文旨在通过浅显易懂的语言,为初学者揭示云原生技术的核心概念及其应用价值。我们将以Docker容器为例,逐步引导读者了解如何将应用程序容器化,并在云端高效运行。这不仅是对技术趋势的跟随,更是对资源利用和开发效率提升的探索。
209 4
|
XML 数据格式 Python
【Python】已解决:xml.parsers.expat.ExpatError: no element found: Line 1, column 0
【Python】已解决:xml.parsers.expat.ExpatError: no element found: Line 1, column 0
620 0
|
资源调度 Dart Shell
emoji大全2
emoji大全
340 0
|
缓存 边缘计算 网络协议
CDN永远的神!成功解决了困惑我多年的GitHub访问太慢问题
我写技术文章画的图片是保存到 GitHub 的,没别的原因,就是因为免费,但是GitHub 访问的速度大家都懂的,访问的速度很慢。 所以我会用 CDN 来加速图片的访问,也就是我的图床的方案是 GitHub + jsdelivr CDN,使用很简单,只需要把域名地址替换一下就行。
|
监控 数据安全/隐私保护
【Magisk模块】阴影截图v3.1.2
【Magisk模块】阴影截图v3.1.2
879 0
【Magisk模块】阴影截图v3.1.2
|
Java 数据安全/隐私保护 微服务
gRPC请求超时和异常处理
gRPC请求超时和异常处理