首頁 > Java > java教程 > 主體

Java中Object類別的方法分析

巴扎黑
發布: 2017-04-15 09:06:14
原創
1759 人瀏覽過

宣告

文章皆為本人技術筆記,轉載請註明出處https://segmentfault.com/u/yzwall

Object類別簡介

#Object類別是所有類別的父類,在Java中只有基本資料型別不是物件。對於所有陣列型別(物件型別&&基本資料型別陣列)都繼承自Object類別;

equals方法

Object類別中判斷兩個物件是否具有相同引用,從而判斷兩個物件是否相同;
子類別只要重寫equals方法,就必須重寫hashCode方法

// in java.lang.Object
public boolean equals(Object obj) {
    return (this == obj);
}
登入後複製
登入後複製

重寫equals方法原則:

  • #自反性:A.equals(A)回傳true;

  • 對稱性:A.equals(B)結果和B.equals(A)相同;

  • 傳遞性:A.equals(B)為true,B.equals(C)為true,則A. equals(C)為true

  • 一致性:對於非null引用A,B, 只要equals()比較運算所用到物件資訊不變,多次呼叫A.equals(B),結果一致;

  • 對於任何非null引用,x.equals(null)必須傳回false;

  • 重寫equals方法時,參數類型必須為Object類型

#重寫equals方法範例

class myObject {
    private String name;
    private int age;
    ...
    public getName() {
        return this.name;
    }
    public getAge() {
        return this.age;
    }
}

/**
 * 重写equals方法demo步骤
 * Effective Java中推荐方式
 */
public boolean equals(Object x) {
    // 1. 检查x和this是否引用同一个对象
    if (x == this) {
        return true;
    }
    
    // 2. 检查x对象类型是否是myObject派生
    if (!(x instanceof myObject)) {
        return false;
    }

    // 3. 比较数据域
    // 经过1,2检查,将参数转换为正确类型
    myObject o = (myObject)(x);
    return this.name.equals(x.getName()) && this.age == (x.getAge());
}
登入後複製
登入後複製

hashCode()方法

hashCode方法傳回物件的雜湊碼,相等物件必須傳回相等的hashCode,不同物件的hashCode盡可能不相等;

// in java.lang.Object
public native int hashCode();
登入後複製
登入後複製

重寫equals時總是要重寫hashCode

  • 重寫equals不重寫hashCode,會導致「不相等物件擁有相同的hashCode」,導致集合類別HashMapHashSetHashtable無法運作;極端情況下,在散列表中使所有物件的hashCode都相等,所有物件都被映射到同一個桶中,散列表退化成鍊錶;

  • 當兩個物件呼叫equal返回true,則兩個物件各自呼叫hashCode()傳回相同hashCode;

  • 當兩個物件呼叫equal回傳false, 兩個物件各自呼叫hashCode()回傳的hashCode可以相同(雜湊衝突不能完全避免 )

toString()方法

Object類別中toString方法,輸出物件的「物件類別名稱@散列碼」;


Java Object類別方法分析


宣告

文章皆為本人技術筆記,轉載請註明出處https://segmentfault.com/u/ yzwall

Object類別簡介

Object類別是所有類別的父類,在Java中只有基本資料類型不是物件。對於所有陣列型別(物件型別&&基本資料型別陣列)都繼承自Object類別;

equals方法

Object類別中判斷兩個物件是否具有相同引用,從而判斷兩個物件是否相同;
子類別只要重寫equals方法,就必須重寫hashCode方法

// in java.lang.Object
public boolean equals(Object obj) {
    return (this == obj);
}
登入後複製
登入後複製

重寫equals方法原則:

  • #自反性:A.equals(A)回傳true;

  • 對稱性:A.equals(B)結果和B.equals(A)相同;

  • 傳遞性:A.equals(B)為true,B.equals(C)為true,則A. equals(C)為true

  • 一致性:對於非null引用A,B, 只要equals()比較運算所用到物件資訊不變,多次呼叫A.equals(B),結果一致;

  • 對於任何非null引用,x.equals(null)必須傳回false;

  • 重寫equals方法時,參數類型必須為Object類型

#重寫equals方法範例

class myObject {
    private String name;
    private int age;
    ...
    public getName() {
        return this.name;
    }
    public getAge() {
        return this.age;
    }
}

/**
 * 重写equals方法demo步骤
 * Effective Java中推荐方式
 */
public boolean equals(Object x) {
    // 1. 检查x和this是否引用同一个对象
    if (x == this) {
        return true;
    }
    
    // 2. 检查x对象类型是否是myObject派生
    if (!(x instanceof myObject)) {
        return false;
    }

    // 3. 比较数据域
    // 经过1,2检查,将参数转换为正确类型
    myObject o = (myObject)(x);
    return this.name.equals(x.getName()) && this.age == (x.getAge());
}
登入後複製
登入後複製

hashCode()方法

hashCode方法傳回物件的雜湊碼,相等物件必須傳回相等的hashCode,不同物件的hashCode盡可能不相等;

// in java.lang.Object
public native int hashCode();
登入後複製
登入後複製

重寫equals時總是要重寫hashCode

  • 重寫equals不重寫hashCode,會導致「不相等物件擁有相同的hashCode」,導致集合類別HashMapHashSetHashtable無法運作;極端情況下,在散列表中使所有物件的hashCode都相等,所有物件都被映射到同一個桶中,散列表退化成鍊錶;

  • 當兩個物件呼叫equal返回true,則兩個物件各自呼叫hashCode()傳回相同hashCode;

  • 當兩個物件呼叫equal回傳false, 兩個物件各自呼叫hashCode()傳回的hashCode可以相同(雜湊衝突不能完全避免 )

toString()方法

Object類別中toString方法,輸出物件的「物件類別名稱@散列碼」;



以上是Java中Object類別的方法分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!