Java新手,强烈不建议你用 a.equals(b) 判断对象相等!
来源:cnblogs.com/juncaoit/p/12422752.html
一直以为这个方法是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,所以通常需要重写该方法来提供逻辑一致性的比较。
PS:如果觉得我的分享不错,欢迎大家随手点赞、在看。
Java新手,强烈不建议你用 a.equals(b) 判断对象相等!相关推荐
- 强烈不建议你用 a.equals(b) 判断对象相等!
以下文章来源方志朋的博客,回复"666"获面试宝典 作者:曹军 cnblogs.com/juncaoit/p/12422752.html 一直以为这个方法是java8的,今天才知道 ...
- 为什么不建议你用a.equals(b)判断对象相等
点击关注公众号,Java干货及时送达 来源:cnblogs.com/juncaoit/p/12422752.html 一直以为这个方法是java8的,今天才知道是是1.7的时候,然后翻了一下源码. 这 ...
- 判断相等_为什么不建议你用a.equals(b)判断对象相等
一:值是null的情况 a.equals(b), a 是null, 抛出NullPointException异常. a.equals(b), a不是null, b是null, 返回false Obj ...
- java webservice接口开发_给Java新手的一些建议----Java知识点归纳(J2EE and Web 部分)
J2EE(Java2 Enterprise Edition) 刚出现时一般会用于开发企业内部的应用系统,特别是web应用,所以渐渐,有些人就会把J2EE和web模式画上了等号.但是其实 J2EE 里面 ...
- 给Java新手的一些建议——Java知识点归纳(Java基础部分)
写这篇文章的目的是想总结一下自己这么多年来使用java的一些心得体会,主要是和一些java基础知识点相关的,所以也希望能分享给刚刚入门的Java程序员和打算入Java开发这个行当的准新手们,希望可以给 ...
- java 解析tgw_给Java新手的一些建议——Java知识点归纳(Java基础部分)
1. JVM相关(包括了各个版本的特性) 对于刚刚接触Java的人来说,JVM相关的知识不一定需要理解很深,对此里面的概念有一些简单的了解即可.不过对于一个有着3年以上Java经验的资深开发者来说,不 ...
- 送给Java新手的建议!
废话不多说,就问你java基础学没学,你是初学者?程序员?这都不妨碍你收藏学习java干活! 没有学过Java基础>>>的同学,基础不牢固的程序猿,都可以在巩固一下! 进入IT领域, ...
- Java新手看招 常用开发工具介绍
Java新手看招 常用开发工具介绍 Java的应用越来越广泛,学习Java的人也越来越多.学过程序设计的人知道,使用Basic进行程序设计,可以使用QBasic.Visual Basic等开发工具:使 ...
- 面试经验//Java新手如何制定优秀的职业规划?看大牛怎么说!
1.基础知识要背,要理解. 2.面试礼仪(感谢,特别是椅子复原). 3.自我介绍. 争取说说自己的优点,或者能显示出你的团队协作能力.学习能力的事,还有做过的自豪的事.(最好别瞎编) 4.感谢给自己的 ...
最新文章
- 【ES6】 let与const详解
- python3菜鸟教程中文-我的python学习方法和资源整理,干货分享
- HTML之表格篇——表格的嵌套
- CAMWorks ShopFloor 2020中文版
- PAT甲级1027 Colors in Mars :[C++题解]进制位
- keras的学习笔记
- [codevs1262] 不要把球传我 数论+组合数学
- Discuz完整手动迁移教程(不使用备份功能)
- 织梦dedecms响应式自媒体图片新闻资讯网站模板
- 从零开始学Symbian (基于carbid.c++、S60第三版)
- cp命令强制覆盖方式实现
- 1200兆路由器网速_办个100M的网,买一个1200M的路由器回家,网速真的会变快吗?...
- java程序设计实用教程 实验6答案_java程序设计实用教程习题解答与实验指导.doc...
- VS 2017 透明背景设置
- java解析md文件_md格式详解
- ai的预览模式切换_ai预览快捷键是什么,Adobe Illustrator预览快捷键是什么?
- 电设——开关电源——LM2596
- stylus 设置全局样式_vue 公共样式处理_全局styl文件
- Promethus(普罗米修斯)监控系统02概述
- php插入数据含有特殊符号的处理方法
热门文章
- 如何判断 cxgrid 双击了哪一列_唐卡的价值主要体现在哪 如何判断唐卡的价值
- 安卓上的微软 Edge 浏览器新增支持长截图
- 动态导入ECMAScript模块一文看懂
- java指定位置写入_java指定路径写、读文件
- 1004 Counting Leaves (30分) (vector实现)
- Codeforces Round #645 (Div. 2)(D.The Best Vacation)
- python打印浮点数_python怎么输出浮点数
- python序列类型包括哪三种映射类型_python序列类型包括哪三种_后端开发
- android自定义view获取控件,android 自定义控件View在Activity中使用findByViewId得到结果为null...
- c++ 动态分配数组_C与C++内存管理避坑指南