一直以为这个方法是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;2.在这种情况下,Objects.equals与情况1的行为是一致的。"abc".equals("")→返回false"".equals("abc")→返回false"".equals("")→返回trueObjects.equals("abc","")→返回falseObjects.equals("","abc")→返回falseObjects.equals("","")→返回true三,源码分析1.源码publicfinalclassObjects{privateObjects(){thrownewAssertionError("Nojava.util.Objectsinstancesforyou!");}/***返回{@codetrue}iftheargumentsareequaltoeachother*and{@codefalse}otherwise.*Consequently,ifbothargumentsare{@codenull},{@codetrue}*isreturnedandifexactlyoneargumentis{@codenull},{@code*false}isreturned.Otherwise,equalityisdeterminedbyusing*the{@linkObject#equalsequals}第一个*参数的方法。**@paramaanobject*@parambanobjecttobecomparedwith{@codea}forequality*@return{@codetrue}iftheargumentsareequaltoeachother*and{@codefalse}otherwise*@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,所以通常需要重写这个方法来提供逻辑上一致的比较。
