面试官:为什么不建议用 equals 判断对象相等?

devtools/2024/10/18 14:26:25/

一直以为这个方法是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。注意:不会抛出空指针异常。

null.equals("abc")    →   抛出 NullPointerException 异常
"abc".equals(null)    →   返回 false
null.equals(null)     →   抛出 NullPointerException 异常
Objects.equals(null, "abc")    →   返回 false
Objects.equals("abc",null)     →   返回 false
Objects.equals(null, null)     →   返回 true

二,值是空字符串的情况:

1.a 和 b 如果都是空值字符串:"", 则 a.equals(b), 返回的值是true, 如果a和b其中有一个不是空值字符串,则返回false;

2.这种情况下 Objects.equals 与情况1 行为一致。

"abc".equals("")    →   返回 false
"".equals("abc")    →   返回 false
"".equals("")       →   返回 true
Objects.equals("abc", "")    →   返回 false
Objects.equals("","abc")     →   返回 false
Objects.equals("","")        →   返回 true

三,源码分析

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,所以通常需要重写该方法来提供逻辑一致性的比较。


http://www.ppmy.cn/devtools/126742.html

相关文章

ChatGPT 现已登陆 Windows 平台

今天,OpenAI 宣布其人工智能聊天机器人平台 ChatGPT 已开始预览专用 Windows 应用程序。OpenAI 表示,该应用目前仅适用于 ChatGPT Plus、Team、Enterprise 和 Edu 用户,是一个早期版本,将在今年晚些时候推出"完整体验"。…

优达学城 Generative AI 课程2:Large Language Models (LLMs) Text Generation

建议先了解一下附录知识。 文章目录 1 官方课程内容自述Lesson 1: 大型语言模型(LLMs)简介Lesson 2: 自然语言处理(NLP)基础Lesson 3: Transformer 和注意力机制Lesson 4: 检索增强生成(RAG)Lesson 5: 为大…

动态规划-简单多状态dp问题——123.买卖股票的最佳时机|||

1.题目解析 题目来源:123.买卖股票的最佳时机|||——力扣 测试用例 2.算法原理 1.状态表示 根据题目可以看出每一天的状态都有"买入""卖出"两种状态,但是还有交易次数限制,因此创建两个二维dp表,f表存储&quo…

面试经典150题刷题记录

数组部分 1. 合并两个有序的子数组 —— 倒序双指针避免覆盖 88. 合并两个有序数组 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使…

Android 禁止App字体随系统大小而更改

运营反馈,老年用户的手机多设置为大字体,在使用我们app过程中,由于字体被放大,导致布局错乱,部分功能按键遮挡,无法正常使用。   收到问题,着手解决,除了对界面布局进行改写&#…

QT--自定义信号槽、信号槽的连接方式、信号槽扩展、一个信号连接两个槽函数、多个信号连接一个槽函数、信号连接信号、断开连接

自定义信号槽 自定义信号和槽的条件: 自定义的类,要继承自 QObject自定义的类,其中要声明一个宏 Q_OBJECT 只有满足了这两个条件才可以正常使用信号槽机制 接下来,我们通过一个案例,演示自定义信号槽的使用。 案例…

python爬虫之使用 Beautiful Soup

Beautiful Soup 是 Python 中用于从 HTML 和 XML 文件中提取数据的库。它通常与 HTTP 请求库(如 requests)一起使用来构建网络爬虫。以下是一个详细的教程,教你如何使用 Beautiful Soup 来爬取网页内容。 1. 安装必要的库 首先,…

开发中众多框架的个人理解,Unity设计模式,MVC,MVVM框架

前往个人博客,获取更好的阅读体验 开发中众多框架的个人理解 首先,无论使用什么框架,使用什么设计模式,本质都是为了分离逻辑,方便扩展,多人协同。换句话说,就是让代码质量更高; 所以并不需要具…