前言

当《阿里巴巴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. ArcMap将Python写的代码转为工具箱与自定义工具

      本文介绍在ArcMap软件中,通过已有的Python脚本程序,建立新的工具箱并在其中设置自定义工具的方法.   通过本文介绍的操作,我们便可以实现将自己的Python代码封装,并像其他ArcGIS ...

  2. keyclaok~keycloak存到cookie中的值和session_state

    keycloak存到cookie中的值 AUTH_SESSION_ID KEYCLOAK_IDENTITY KEYCLOAK_SESSION AUTH_SESSION_ID 用户的当前session_ ...

  3. 念一句咒语 AI 就帮我写一个应用,我人麻了...

    原文链接:https://forum.laf.run/d/232 作为人类,我们时常会有自己独特的想法和脑洞大开的创意.然而,这些想法往往因为成本过高而无法实现,毕竟每个人的能力和精力都是有限的,尤其 ...

  4. kali装机 安装输入法 修改国内源

    1-先配置国内源官方kali源 vim /etc/apt/sources.list 插入如下源 deb http://mirrors.aliyun.com/kali sana main non-fre ...

  5. Java设计模式 —— 观察者模式

    16 观察者模式 16.1 观察者模式概述 Observer Pattern: 定义对象之间的依赖关系(一对多),当一个对象的状态发生改变时,其关联的依赖对象均收到通知并自动更新. 观察者模式又称:发 ...

  6. 访问不到tomcat下的静态资源文件

    问题:idea+tomcat 测试Servlet,居然访问不到与WEB-INF同级的静态资源1.html.又不是访问WEB-INF里的文件.... 分析:可能是开发目录中的文件没有自动复制到部署目录. ...

  7. ditto 添加统计粘贴次数功能

    通过观察ditto的表发现, 可以添加触发器进行统计粘贴次数的功能,不需要用源码 Ditto 是一款强大的 Windows 剪贴板增强工具,它支持64位操作系统,而且完全免费,绿色开源,支持中文,而且 ...

  8. OI 数论中的上界估计与时间复杂度证明

    预备 0.1 渐进符号 其实不少高等数学 / 数学分析教材在讲解无穷小的比较时已经相当严谨地介绍过大 O.小 O 记号,然而各种历史习惯记法的符号滥用(abuse of notation)[1] 直到 ...

  9. 快速上手Linux核心命令(五):文本处理三剑客

    @ 目录 前言 正则表达式 第一剑客 grep 第二剑客 sed 第三 剑客 awk 小结 剑仙镇楼~ O(∩_∩)O 前言 上一篇中已经预告,我们这篇主要说Linux文本处理三剑客.他们分别是gre ...

  10. ntp导致其他线程卡顿原因总结

    这个是在项目开发中遇到的一个比较严重的问题,第一影响到主界面的播放卡顿,第二影响到我这边线程同样卡顿,按道理来说两个没有数据交互的线程应该没有任何影响,改为detach模式也没用,最后定位到居然是单独 ...