首页 > 其他分享 >你还在用Object.equals()方法吗?

你还在用Object.equals()方法吗?

时间:2023-06-06 16:46:02浏览次数:37  
标签:对象 Object equals Objects null 方法

前言

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


一、Java开发手册说明

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

Java开发手册中对Object的equals方法的说明

这里说 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,Objects,null,方法
From: https://www.cnblogs.com/coding-rocket/p/17460977.html

相关文章

  • [ABAQUS有限元分析]挤扩支盘桩支护基坑优化设计方法
    ​工程背景为探讨基坑支护工程中挤扩支盘桩的优化设计方案,结合室内模型试验结果,利用ABAQUS软件模拟支盘桩的成桩过程及成桩后基坑开挖过程,分析桩体受力特征及桩后土体变形特征,进而探讨桩土作用机制。模型设计平面图如图1所示。   混凝土桩与土......
  • ArcGIS绘制研究区域图的方法
      本文介绍基于ArcMap软件,绘制论文中研究区域示意图、概况图等的方法。  最近需要绘制与地学有关论文、文献中的研究区域概况图。对于这一类图片,我个人比较喜欢基于ArcMap与PPT结合的方式来绘制,具体操作如下。  当然,首先这里要提一句:大家一定需要注意,绘制我国相关的地图时(......
  • java中equals与matches区别
    matches:判断字符是否与指定的正则表达式相匹配equals:判断二个字符串是否相等举例:1.看例题https://www.nowcoder.com/share/jump/3295745116860251147252.看例题https://www.nowcoder.com/share/jump/329574511686025148552总结:一个是判断是否符合正则表达式规则,另一个是判断是......
  • 网站性能工具Yslow的使用方法
    Yslow是雅虎开发的基于网页性能分析浏览器插件Yslow的安装方法现在Yslow已经有很多版本了,本文介绍的是3.0.4最新版,打开Yslow官网就能看到有四个版本可供选择:火狐(firefox)浏览器、谷歌(chrome)浏览器、欧朋(opera)浏览器和移动版。安装Yslow要先安装Firebug(本地址以火狐为例),两种方法启动......
  • 运用赋能计算方法,在网格层面量化东莞外卖垃圾产生情况笔记
    原文链接:Fullarticle:QuantifythefooddeliverypackagewastegenerationofDongguaningridlevelusingempowermentcalculationmethod(tandfonline.com) ......
  • 切片线特征提取问题线的修补方法
    存在问题1.同一方向重复连接处理:遍历所有近邻M中的线段,如果j和k夹角小于3度,删除距离远的那个近邻。2.近似平行线段处理:取线段i的近邻,如果j和k平行(3度),且i和近邻j和k都平行,5-10度,修正i的角度。3.拐角处近似垂直线段处理:取线段i的近邻,如果j和k垂直(<3度),且i和近邻j平行,和近邻k......
  • ESP32的JTAG调试方法
    ReportofJTAGIntroduction:Figuringoutabugthatiscausedbytwothreads,runningevensimultaneouslyontwodifferentCPUcores,cantakealongtimewhenallyouhaveareprintf()statements.Abetter(andinmanycasesquicker)waytodebugsuch......
  • [C#]c#中数据的同步加锁机制 的几种方法
    一,锁定机制最简单的做法就是使用锁定关键字Lock。Lock关键字英文中就是锁的意思,顾名思义就是为操作加上一把锁。它的语法如下: lock(lockObj){//加锁的代码段,一般是操作共同资源的代码}二、同步方法(synchronized)案例代码:usingSystem;usingSystem.Runtime.CompilerServices;......
  • C# 中==与Equals方法比较
    先来段代码,如下:staticvoidMain(string[]args){stringa=newstring(newchar[]{'h','e','l','l','o'});stringb=newstring(newchar[]{'h','e',&......
  • variable-sized object may not be initialized
    #include<stdio.h>intmain(void){intN;scanf("%d",&N);inta[N]={0};//错误在这,可以用变量定义数组,但不能初始化for(inti=0;i<N;++i){scanf("%d",&a[i]);}intM,sum=0;scanf("%d",&......