Java
中的Object
提供了不少方法供全部的類使用,特別是toString
、hashCode
、equals
、getClass
等方法,在平常開發中做用很大,Guava
中包含Objects
類,其提供了不少更爲強大的方法。java
Objects
是Object
的子類,其提供了equal
、toStringHelper
等方法,下面根據一個示例來分析源碼。google
package com.hust.grid.leesf.guavalearning; import com.google.common.base.Objects; public class ObjectsTest { public static void main(String[] args) { Integer i1 = new Integer(10); Integer i2 = new Integer(10); System.out.println(Objects.equal(i1, i2)); System.out.println(Objects.toStringHelper("Person").add("name", "leesf").add("age", 25)); } }
運行結果:code
true
Person{name=leesf, age=25}對象
能夠看到,Objects
對象能夠很輕鬆的比較兩個對象是否相等,而且還能夠使用toStringHelper
來格式化對象的屬性,清晰易懂,便於定位異常。開發
Java
中的Object
對象的equals
方法,傳遞一個參數;而Objects
提供equal
方法,傳遞兩個參數,來比較兩個對象是否相等。字符串
public static boolean equal(@Nullable Object a, @Nullable Object b) { return a == b || (a != null && a.equals(b)); }
能夠看到,
equal
方法只是預先進行了一次判斷,若爲同一個引用,則返回true
,不然,調用Object a
的equals
方法,若其重寫了equals
方法,則調用自身方法,不然調用父類的equals
方法,直至最後Object
類的equals
方法。get
該方法是
Objects
中很是有用的方法,能夠格式化對象的輸出,通常狀況下是重寫toString
方法,而後將對象的屬性逐一寫出,而Objects
中提供了toStringHelper
方法,能夠很方便的格式化輸出。源碼
toStringHelper
會生成一個ToStringHelper
對象,若傳遞的爲非String
類型值,則首先會調用simpleName
方法簡化類名,如傳遞的爲整形3
,simpleName
方法則返回Integer
。在調用
toStringHelper
方法返回一個ToStringHelper
對象,其結構以下。string
public static final class ToStringHelper { private final String className; private ValueHolder holderHead = new ValueHolder(); private ValueHolder holderTail = holderHead; private boolean omitNullValues = false; // methods }
能夠看到其存在一個className
屬性,用來保存類名,如Person
、Integer
等字符串;存在一個ValueHolder
類型的holderHead
對象,表示鏈表的頭結點;存在一個ValueHolder
類型的holderTail
對象,表示鏈表的尾節點;存在一個omitNullValues
變量用來指示是否跳過null
值,其中ValueHolder
是實際存放元素的地方,其結構以下。hash
private static final class ValueHolder { String name; Object value; ValueHolder next; }
能夠看到ValueHolder
會單鏈表結構,當調用add
方法時,其就在鏈表末尾添加一個節點。
在調用
toStirngHelper
方法返回ToStringHelper
對象後,可調用add
方法。add
方法整個調用會在鏈表的末尾添加一個ValueHolder
節點,而且使用ToStringHelper
的holderTail
對象指向尾節點。
當打印時,會調用
ValueHolder
對象的toString
方法,其會首先輸出className{
,而後遍歷鏈表,將包含key-value
或只包含value
類型的節點按照指定格式輸出,最後添加}
。
Objects
類源碼相對簡單,其提供了格式化對象的方法,使用也很是簡單,很是方便在實際開發的時候使用。