来源: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) 判断对象相等!相关推荐

  1. 强烈不建议你用 a.equals(b) 判断对象相等!

    以下文章来源方志朋的博客,回复"666"获面试宝典 作者:曹军 cnblogs.com/juncaoit/p/12422752.html 一直以为这个方法是java8的,今天才知道 ...

  2. 为什么不建议你用a.equals(b)判断对象相等

    点击关注公众号,Java干货及时送达 来源:cnblogs.com/juncaoit/p/12422752.html 一直以为这个方法是java8的,今天才知道是是1.7的时候,然后翻了一下源码. 这 ...

  3. 判断相等_为什么不建议你用a.equals(b)判断对象相等

    一:值是null的情况 a.equals(b), a 是null, 抛出NullPointException异常. a.equals(b), a不是null, b是null,  返回false Obj ...

  4. java webservice接口开发_给Java新手的一些建议----Java知识点归纳(J2EE and Web 部分)

    J2EE(Java2 Enterprise Edition) 刚出现时一般会用于开发企业内部的应用系统,特别是web应用,所以渐渐,有些人就会把J2EE和web模式画上了等号.但是其实 J2EE 里面 ...

  5. 给Java新手的一些建议——Java知识点归纳(Java基础部分)

    写这篇文章的目的是想总结一下自己这么多年来使用java的一些心得体会,主要是和一些java基础知识点相关的,所以也希望能分享给刚刚入门的Java程序员和打算入Java开发这个行当的准新手们,希望可以给 ...

  6. java 解析tgw_给Java新手的一些建议——Java知识点归纳(Java基础部分)

    1. JVM相关(包括了各个版本的特性) 对于刚刚接触Java的人来说,JVM相关的知识不一定需要理解很深,对此里面的概念有一些简单的了解即可.不过对于一个有着3年以上Java经验的资深开发者来说,不 ...

  7. 送给Java新手的建议!

    废话不多说,就问你java基础学没学,你是初学者?程序员?这都不妨碍你收藏学习java干活! 没有学过Java基础>>>的同学,基础不牢固的程序猿,都可以在巩固一下! 进入IT领域, ...

  8. Java新手看招 常用开发工具介绍

    Java新手看招 常用开发工具介绍 Java的应用越来越广泛,学习Java的人也越来越多.学过程序设计的人知道,使用Basic进行程序设计,可以使用QBasic.Visual Basic等开发工具:使 ...

  9. 面试经验//Java新手如何制定优秀的职业规划?看大牛怎么说!

    1.基础知识要背,要理解. 2.面试礼仪(感谢,特别是椅子复原). 3.自我介绍. 争取说说自己的优点,或者能显示出你的团队协作能力.学习能力的事,还有做过的自豪的事.(最好别瞎编) 4.感谢给自己的 ...

最新文章

  1. 【ES6】 let与const详解
  2. python3菜鸟教程中文-我的python学习方法和资源整理,干货分享
  3. HTML之表格篇——表格的嵌套
  4. CAMWorks ShopFloor 2020中文版
  5. PAT甲级1027 Colors in Mars :[C++题解]进制位
  6. keras的学习笔记
  7. [codevs1262] 不要把球传我 数论+组合数学
  8. Discuz完整手动迁移教程(不使用备份功能)
  9. 织梦dedecms响应式自媒体图片新闻资讯网站模板
  10. 从零开始学Symbian (基于carbid.c++、S60第三版)
  11. cp命令强制覆盖方式实现
  12. 1200兆路由器网速_办个100M的网,买一个1200M的路由器回家,网速真的会变快吗?...
  13. java程序设计实用教程 实验6答案_java程序设计实用教程习题解答与实验指导.doc...
  14. VS 2017 透明背景设置
  15. java解析md文件_md格式详解
  16. ai的预览模式切换_ai预览快捷键是什么,Adobe Illustrator预览快捷键是什么?
  17. 电设——开关电源——LM2596
  18. stylus 设置全局样式_vue 公共样式处理_全局styl文件
  19. Promethus(普罗米修斯)监控系统02概述
  20. php插入数据含有特殊符号的处理方法

热门文章

  1. 如何判断 cxgrid 双击了哪一列_唐卡的价值主要体现在哪 如何判断唐卡的价值
  2. 安卓上的微软 Edge 浏览器新增支持长截图
  3. 动态导入ECMAScript模块一文看懂
  4. java指定位置写入_java指定路径写、读文件
  5. 1004 Counting Leaves (30分) (vector实现)
  6. Codeforces Round #645 (Div. 2)(D.The Best Vacation)
  7. python打印浮点数_python怎么输出浮点数
  8. python序列类型包括哪三种映射类型_python序列类型包括哪三种_后端开发
  9. android自定义view获取控件,android 自定义控件View在Activity中使用findByViewId得到结果为null...
  10. c++ 动态分配数组_C与C++内存管理避坑指南