1. 程式人生 > 實用技巧 >【冰啤】 兩個物件的 hashCode()相同 則 equals()也一定為 true 對嗎?

【冰啤】 兩個物件的 hashCode()相同 則 equals()也一定為 true 對嗎?

不正確 因為這兩個方法都可以進行重寫 這兩個方法的返回結果不具有唯一性

// 自定義類A 並重寫hashCode()方法
public class ObjectA {
    @Override   // 表示方法重寫
    public int hashCode() {
        return 1;
    }
}
// 自定義類B 並重寫HashCode()方法
public class ObjectB {
    @Override
    public int hashCode() {
        return 1;
    }
}
public class TestHashCode {
    public static void main(String[] args) {
        ObjectA a = new ObjectA();
        ObjectB b = new ObjectB();
        System.out.println(a.hashCode() == b.hashCode());	// true
        System.out.println(a.equals(b));					// false
    }
}

如果我們不考慮對這兩個方法進行重寫的情況下有以下結論:
兩個物件equals相等,則它們的hashcode必須相等,反之則不一定。
兩個物件==相等,則其hashcode一定相等,反之不一定成立。

public class TestHashCode {
    public static void main(String[] args) {
        // 此時物件c和物件d會指向相同的記憶體區域
        Object c = new Object();
        Object d = c;
        System.out.println(c);	// java.lang.Object@1b6d3586
        System.out.println(d);	// java.lang.Object@1b6d3586
        // 沒有進行重寫的 euqls 方法的底層實現就是 == 
        System.out.println(c.equals(d));	// true
        System.out.println(c.hashCode());	// 460141958
        System.out.println(d.hashCode());	// 460141958
    }
}

hashCode 的常規協定:

1.在 Java 應用程式執行期間,在對同一物件多次呼叫 hashCode方法時,必須一致地返回相同的整數,前提是將物件進行 equals 比較時所用的資訊沒有被修改。從某一應用程式的一次執行到同一應用程式的另一次執行,該整數無需保持一致。

public class TestHashCode {
    public static void main(String[] args) {
        Object a = new Object();
        Object b = a;
        System.out.println(b.hashCode());   // 460141958
        Object c = new Object();
        b = c;
        System.out.println(b.hashCode());   // 1163157884
        b = a;
        System.out.println(b.hashCode());   // // 460141958
    }
}

2.兩個物件的 equals()相等,那麼對這兩個物件中的每個物件呼叫 hashCode 方法都必須生成相同的整數結果。

3.兩個物件的equals()不相等,那麼對這兩個物件中的任一物件上呼叫 hashCode 方法不要求一定生成不同的整數結果。但是,為不相等的物件生成不同整數結果可以提高雜湊表的效能。