当前位置: 首页 > 后端技术 > Java

Java中equals的这些坑千万别踩,..

时间:2023-04-01 21:37:33 Java

来源: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,返回false3.比较Objects.equals(a,b)时,如果a和b都为null,返回true,如果a和b其中之一为null,另一个不为null,返回false。注意:不会抛出空指针异常。null.equals("abc")→抛出NullPointerException"abc".equals(null)→返回falsenull.equals(null)→抛出NullPointerExceptionObjects.equals(null,"abc")→返回falseObjects.equals("abc",null)→returnfalseObjects.equals(null,null)→值为空字符串时返回true1.如果a和b都是空字符串:"",那么a.equals(b),返回值为true,如果a和b之一不是空字符串,则返回false;2.在这种情况下,Objects.equals与情况1的行为是一致的。"abc".equals("")→返回false"".equals("abc")→返回false"".equals("")→返回trueObjects.equals("abc","")→返回falseObjects.equals("","abc")→返回falseObjects.equals("","")→返回true源码分析1、源码*@since1.7*/publicfinalclassObjects{privateObjects(){thrownewAssertionError("Nojava.util.Objects实例给你!”);}/***如果参数彼此相等则返回{@codetrue}*否则返回{@codefalse}。*因此,如果两个参数都是{@codenull},则返回{@codetrue}*如果只有一个参数是{@codenull},则返回{@code*false}。否则,通过使用*第一个参数的{@linkObject#equalsequals}方法来确定相等性。**@parama一个对象*@paramb一个对象与{@codea}比较是否相等*@return{@codetrue}如果参数彼此相等*和{@codefalse}否则*@seeObject#equals(Object)*/publicstaticbooleanequals(Objecta,对象b){返回(a==b)||(a!=null&&a.equals(b));}2.解释首先判断对象地址,如果为真,则不再进一步判断,如果不相等,下面表达式的意思是先判断a不为空,然后根据上面的知识点,将不再有空指针。因此,如果它们都为null,则在第一次判断时为真。如果不为空,地址不同,重要的是判断a.equals(b)。“a==b”和“a.equals(b)”有什么区别?如果a和b都是对象,那么a==b比较两个对象的引用,只有当a和b指向堆中的同一个对象时才返回true。而a.equals(b)是逻辑比较。当内容相同时返回true,所以通常需要重写这个方法来提供逻辑上一致的比较。近期热点文章推荐:1.1000+Java面试题及答案(2022最新版)2.厉害了!Java协程来了。..3.SpringBoot2.x教程,太全面了!4.不要用爆破爆满画面,试试装饰者模式,这才是优雅的方式!!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!