这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战
写在前面
平常开发中,大家都用什么方法来判断两个值是否相等,脱口而出的是equals,先给大家个结论,那就是不建议大家a.equals(b)去判断是否相等,看完本篇文章就知道了,大家都知道的是判断对象是否为空 是否相同都是拿== 来判断,那么不是对象呢。
当值是null的情况
1、a.equals(b) , a 是null
1 | java复制代码null.equals("abc") → 抛出 NullPointerException 异常 |
这种意料之内,null是不能干任何事的,否则都会报空指针的
2、a.equals(b), a不是null, b是null
1 | java复制代码"abc".equals(null) → 返回 false |
可以看到 这次不报错了。而且结果确实为false。
3、a和b都为null时,我们看下(肯定也报空指针)
1 | java复制代码null.equals(null) → 抛出 NullPointerException 异常 |
也经常拿Objects来判断 。Objects.equals(a, b)比较时, 若a 和 b 都是null, 则返回 true, 如果a 和 b 其中一个是null, 另一个不是null, 则返回false。注意:不会抛出空指针异常。
1 | java复制代码Objects.equals(null, "abc") → 返回 false |
接下来再看当是空字符串的情况
值是空字符串
1、a 和 b 如果都是空值字符串:””
1 | java复制代码"".equals("") → 返回 true |
1、如果a和b其中有一个不是空值字符串,则都会返回false;
1 | java复制代码"abc".equals("") → 返回 false |
再看Objects
1 | java复制代码Objects.equals("abc", "") → 返回 false |
所以说当值是空字符串的时候 这样判断是没有问题的。
我们看下源码,为什么会出现这种差异
究其源码
先来看Objec根类 equals
1 | java复制代码public class Object { |
接下来再看Objecs中的equals
1 | java复制代码public final class Objects { |
- 首先,进行了对象地址的判断,如果是真,则不再继续判断。
- 如果不相等,后面的表达式的意思是,先判断a不为空,然后根据上面的知识点,就不会再出现空指针。
- 所以,如果都是null,在第一个判断上就为true了。如果不为空,地址不同,就重要的是判断a.equals(b)。
总结
当Object.equals 第一值要判空,或者直接用Objects.equals去判断
OK。今天我们就学习到这里,分享一点小细节,积少成多。我们下期再见 加油!
弦外之音
本文转载自: 掘金