一直以为这个方法是java8的,今天发现是1.7的,然后查看源码。本文将总结一下与a.equals(b)的区别,然后对源码做一个小分析。1、当值为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)→returntrue二、当值为空串时:1.如果a和b都是空串:"",则a.equals(b),返回值为真,如果a和b其中之一不是空字符串,则返回false;SpringBoot学习笔记分享给大家。2.在这种情况下,Objects.equals的行为与情况1相同。Java核心技术教程和示例源码见这里:https://github.com/javastacks/javastack"abc".equals("")→returnfalse"".equals("abc")→returnfalse""。equals("")→返回trueObjects.equals("abc","")→返回falseObjects.equals("","abc")→返回falseObjects.equals("","")→返回true三、源码分析1.源代码publicfinalclassObjects{privateObjects(){thrownewAssertionError("Nojava.}*isreturnedandifexactlyoneargumentis{@codenull},{@code*false}isreturned.Otherwise,equalityisdeterminedbyusing*the{@linkObject#equalsequals}methodofthefirst*argument.**@paramaanobject*@parambanobjecttobecomparedwith{@codea}forequality*@return}{@codea}forequality*@return{@codeiftheargumentsareequaltoeachother*and{@codefalse}otherwise*@seeObject#equals(Object)*/publicstaticbooleanequals(Objecta,Objectb){return(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,所以通常需要重写这个方法来提供逻辑上一致的比较。
