天天看點

Object常用方法介紹及注意事項equals(),hashCode(),getClass(),toString()

equals

public boolean equals()

官方API描述 :

equals 方法在非空對象引用上實作相等關系 Object 類的 equals

方法實作對象上差别可能性最大的相等關系;即,對于任何非空引用值 x 和 y,當且僅當 x 和 y 引用同一個對象時,此方法才傳回

true(x == y 具有值 true)。 實際中,根據對象 的特有内容來判斷對象是否相同,覆寫此方法

注意:當此方法被重寫時,通常有必要重寫 hashCode 方法,以維護 hashCode

方法的正常協定,該協定聲明相等對象必須具有相等的哈希碼。

Object的equals()方法比較的是位址,但是實際開發中一般根據對象 的特有内容來判斷對象是否相同,覆寫此方法。

hashCode

public int hashCode()

官方API描述 :

hashCode 的正常協定是:

在 Java 應用程式執行期間,在對同一對象多次調用 hashCode 方法時,必須一緻地傳回相同的整數,前提是将對象進行 equals

比較時所用的資訊沒有被修改。從某一應用程式的一次執行到同一應用程式的另一次執行,該整數無需保持一緻。 如果根據

equals(Object) 方法,兩個對象是相等的,那麼對這兩個對象中的每個對象調用 hashCode 方法都必須生成相同的整數結果。

如果根據 equals(java.lang.Object) 方法,兩個對象不相等,那麼對這兩個對象中的任一對象上調用 hashCode

方法不 要求一定生成不同的整數結果。但是,程式員應該意識到,為不相等的對象生成不同整數結果可以提高哈希表的性能。 實際上,由 Object

類定義的 hashCode 方法确實會針對不同的對象傳回不同的整數。(這一般是通過将該對象的内部位址轉換成一個整數來實作的,但是

JavaTM 程式設計語言不需要這種實作技巧。)

getClass

public final Class

<?>

getClass()傳回此 Object 的運作時類。

官方API描述 :

傳回的 Class 對象是由所表示類的 static synchronized 方法鎖定的對象。

實際結果類型是 Class

<? extends |X|>

,其中 |X| 表示清除表達式中的靜态類型,該表達式調用 getClass。 例如,以下代碼片段中不需要強制轉換:

Number n = 0;

Class

<? extends Number>

c = n.getClass();

當我們在建立對象時,必須先有類.class檔案加載完成,然後通過.class檔案擷取到裡面的具體内容,包括屬性及行為,是以對于同一個類型的對象getClass()擷取的内容時相同的

toString

public String toString()傳回該對象的字元串表示。

官方API描述 :

通常,toString 方法會傳回一個“以文本方式表示”此對象的字元串。結果應是一個簡明但易于讀懂的資訊表達式。建議所有子類都重寫此方法。

Object 類的 toString 方法傳回一個字元串,該字元串由類名(對象是該類的一個執行個體)、at

标記符“@”和此對象哈希碼的無符号十六進制表示組成。換句話說,該方法傳回一個字元串,它的值等于:

getClass().getName() + ‘@’ + Integer.toHexString(hashCode())

實際中建議所有子類都覆寫這個方法來實作特有功能

代碼示範

class Demo
{
    private int age;
    Demo(){}
    Demo(int age)
    {
        this.age = age;
    }

    //根據對象 的特有内容來判斷對象是否相同,覆寫此方法
    public  boolean equals(Object o)
    {


        if(o instanceof Demo)
            return this.age == ((Demo)o).age;//這裡必須做類型轉換,否則Object對象不能通路子類特有内容
        else
            throw new ClassCastException("類型錯誤!");
    }

    //實際情況中若覆寫了equals方法,也要覆寫hashCode()方法,以保證相同對象産生相同哈希值
    public int hashCode()
    {
        return age;//瞎寫的
    }
}
    class EqualDemo 
{
    public static void main(String[] args) 
    {
        //equals測試
        Demo d = new Demo();
        Demo d1 = new Demo();
        Demo d2 = d;
        System.out.println(d.equals(d1));
        System.out.println(d.equals(d2));

        //hashCode測試
        System.out.println(d.toString()+'\n'+d1.toString()+'\n'+d2.toString());
        //列印對象哈希值
        //[email protected]
        //[email protected]
        //[email protected]

        System.out.println(d.hashCode());//哈希值的十進制705927765
        //System.out.println(Integer.toHexString(d.hashCode()));//同樣是705927765
        System.out.println("d哈希值 : "+d.hashCode()+"d2哈希值 : "+d2.hashCode());//d哈希值 : 10d2哈希值 : 10

        //getClass()測試
        Class  c1 = d.getClass();
        Class c2 = d1.getClass();
        System.out.println(c1==c2);//true,因為c1,c2産生自同一個Class檔案


    }
}
           
Object常用方法介紹及注意事項equals(),hashCode(),getClass(),toString()