前言

当《阿里巴巴Java开发手册》发布后,我也是仔细进行了阅读,想从中找出一些“标准”,让自己的代码质量提高。手册中对 Objectequals 方法的使用进行了强制,而且推荐使用 JDK7 中工具类 Objectsequals 方法,至此之后我就很少使用 Object.equals() 方法了。


一、Java开发手册说明

在第一章:编程规约 -> 第四节:OOP规约 -> 第6条内容如下图:

这里说 Object.equals() 方法容易抛空指针异常,空指针异常相信大家并不陌生,应该使用确定有值的对象来调用 equals() 方法,不能无中生有,不能从 null 调用方法,还举了正例与反例。最后推荐使用 Objects.equals() 方法。

二、Object.equals()方法

Object.equals() 方法是 Java 语言中的一个基础方法,用来比较两个对象是否相等。以下是它的源代码实现:

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

这个方法的实现非常简单,它首先用引用比较来检查传递给它的参数对象是否是当前对象本身,如果是,则返回 true,表示两个对象相等。否则,它返回 false,表示两个对象不相等。

我们需要注意的是,Objectequals() 方法是根据对象的引用来判断两个对象是否相等的,而不是根据对象的内容。如果我们要比较两个对象的内容是否相等,我们需要重写 equals() 方法,这样就可以根据对象的具体内容来判断它们是否相等了。

比如 Java 中的字符串类 String 就是通过重写 equals() 方法来实现字符串内容的比较的。例如,以下代码比较两个字符串的内容是否相等:

String str1 = new String("你好");
String str2 = new String("你好"); // 比较两个字符串的内容是否相等
if(str1.equals(str2)) {
System.out.println("这两个字符串内容相等。");
}
else {
System.out.println("这两个字符串内容不相等");
}

执行结果为:

这两个字符串内容相等。

三、Objects.equals()方法

Java 中的 Objects.equals() 方法实际上是由 Java 中的 Objects 类提供的静态方法,以下是它的源代码:

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

这个方法的实现非常简洁,它首先通过引用比较来检查传递给它的两个对象是否相同。如果相同,它直接返回 true。否则,它进一步检查第一个参数是否为 null,如果为 null,则返回 false。否则,它调用第一个参数的 equals() 方法来比较两个对象的内容是否相同。

我们需要注意的是,这个方法中使用的是逻辑或运算符(||)。首先检查第一个条件是否为 true,只有当第一个条件为 false 时才会执行第二个条件。这种方式在 Java 中有时被称为 "short-circuiting"。这里也就是短路或,这种技巧可以用来提高代码的效率,避免执行不必要的操作。

Objects.equals() 方法是 Java 中用于比较两个对象是否相等的一个实用工具方法,它可以处理对象为 null 的情况,避免了因对象为 null 而产生 NullPointerException 的问题。具体来说,如果两个参数都是 null,则返回 true;如果一个参数是 null 而另一个不是 null,则返回 false;否则,调用第一个参数的 equals 方法进行比较。这样就避免了空指针异常了。

四、Objects.equals()和Object.equals()

Java 中的 Objects.equals()Object.equals() 方法都用于比较两个对象是否相等,但是它们之间还是有一些差异的。

  • 对比 null 值:Objects.equals() 方法可以比较 null 值,而 Object.equals() 方法不能比较 null 值,如果比较 null 值,将会抛出 NullPointerException

  • 实现原理:Objects.equals() 方法内部调用的是第一个对象的 equals() 方法进行比较,如果第一个对象为 null,则直接返回与第二个对象比较的结果。而 Object.equals() 方法直接比较两个对象的引用是否相同。

  • 参数类型:Objects.equals() 方法的两个参数可以是任意类型,而 Object.equals() 方法的参数必须是 Object 类型。


总结

建议使用 JDK7 中工具类 Objectsequals 方法。


关注公众号:编程火箭车

我们定期发布编程相关的文章、资讯、活动等内容。帮助编程爱好者、初学者或初级程序员快速入门、打牢基础。欢迎大家关注,和我们一起探索编程的精彩世界。

你还在用Object.equals()方法吗?的更多相关文章

  1. Object equals 方法

    package com.mydemo.controller; public class TestEquals { public static void main(String[] args) { Do ...

  2. 浅析Object基类提供的Equals方法

    当我们去查看object.cs源代码文件的时候,会发现object基类提供了三种判断相等性的方法.弄清楚每种方法存在的原因,也就是具体解决了什么问题,对我们理解.net判断对象相等性的逻辑很有帮助,下 ...

  3. object.Equals与object.ReferenceEquals方法

    object.Equals方法表达的是语义判等,不一定是引用判等. object.ReferenceEquals方法是肯定是引用判等. 怎么实现一个对象的值语义的 Equals方法?实验. MyCla ...

  4. Java Object类中的equals方法

    Object类中的equals方法用于检测一个对象是否等于另外一个对象.在Object类中,这个方法将判断两个对象是否具有相同的引用.如果两个对象具有相同的引用,它们一定是相等的.从这点上看,将其作为 ...

  5. java中hashCode方法与equals方法的用法总结

    首先,想要明白hashCode的作用,必须要先知道Java中的集合. 总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set. 前者集合内的元素是有序的,元素可以重 ...

  6. 重写equals方法的约定

    1. 什么时候需要重写Object.equals方法 如果类具有自己特有的“逻辑相等”概念(不同于对象等同的概念),而且超类还没有覆盖equals以实现期望的行为,这时我们就需要覆盖equals方法. ...

  7. Effective Java 第三版——10. 重写equals方法时遵守通用约定

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  8. 浅析c#中==操作符和equals方法

    在之前的文章中,我们讲到了使用C#中提供的Object类的虚Equals方法来判断Equality,但实际上它还提供了另外一种判断Equality的方法,那就是使用==运算符.许多童鞋也许会想当然的认 ...

  9. C#值类型和引用类型与Equals方法

    1. C#的值类型和引用类型 C#的对象里面有两种类型,一个是引用类型,一个是值类型,值类型和引用类型的具体分类可以看下面的分类.   在C#中,不管是引用类型还是值类型,他们都隐式继承Object类 ...

  10. [Guava官方文档翻译] 5. Guava的Object公共方法 (Common Object Utilities Explained)

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3537367.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...

随机推荐

  1. C#中的命名空间和程序集

    前言 今天这篇文章和大家一起学习下C#语言下的命名空间和程序集. 在日常的编码工作中,我们对命名空间和程序集都不会很陌生.在创建项目文件时,IDE自动会为我们创建好一个大的命名空间和程序集.大多数业务 ...

  2. 一次对pool的误用导致的.net频繁gc的诊断分析

    (最近有读者朋友表示,希望能加一些示意图来描述分析过程中用到的原理知识.好的,之后我会注意,谢谢这位读者) 背景 有位朋友找我,希望我能帮看一下他的一个service.从他的描述看,并没有资源方面的泄 ...

  3. 解决ubuntu 20.04、22.04 即新版本 fcitx 无法使用的问题

    前提 已在系统设置中将fcitx设置为默认 fcitx开机自启 配置的过程不在本文讨论范围之内 开机自启可通过安装gnome-tweaks配置实现 问题分析流程 手动启动fcitx时提示设置XMODI ...

  4. SpringBoot打包成exe(别再用exe4j了,使用JDK自带工具)

    SpringBoot打包成exe(别再用exe4j了,使用JDK自带工具) 搜到大部分打包exe的文章都是使用exe4j打包 步骤贼多,安装麻烦,打包麻烦 收费软件,公司使用会吃律师函 JDK14以上 ...

  5. 使用 Solon Cloud 的 Jaeger 做请求链路跟踪

    <dependency> <groupId>org.noear</groupId> <artifactId>jaeger-solon-cloud-plu ...

  6. LeeCode 动态规划(三)

    完全背包问题 题目描述 有 n 件物品和容量为 w 的背包,给你两个数组 weights 和 values,分别表示第 i 件物品的重量和价值,每件物品可以放入多次,求解将哪些物品装入背包可使得物品价 ...

  7. Linux(六)进程管理

    Linux系统管理 linux中的进程与服务 进程:Linux中正在执行的程序或者命令 服务:Linux中一直存在.常驻内存的进程 守护进程:进程按照运行方式进行划分,又分为前台显示和后台显示的进程( ...

  8. PyG 图神经网络依赖环境安装(Anaconda)

    1.默认用户在Anaconda的虚拟环境中已安装Pytorch 2.打开anaconda prompt命令窗, activate "你的虚拟环境名称" 3.在激活后的虚拟环境下输入 ...

  9. C++模板(函数模板 & 类模板)

    模板编程可称范型编程,是一种忽视数据类型的编程方式,这样的好处是什么?且看下面一个例子: 简单使用 求解最值问题,返回两个值中的较大值: int Max(int a, int b) { return ...

  10. Linux shell和环境变量

    环境变量 存储有关shell会话和工作环境信息:允许在内存中存储数据. 注意什么时候要用$ 什么时候不用$:用到变量,需要$;操作变量,不需要$.printenv除外 分为两类: 全局变量:对shel ...