【冰啤】 兩個物件的 hashCode()相同 則 equals()也一定為 true 對嗎?
阿新 • • 發佈:2020-12-25
不正確 因為這兩個方法都可以進行重寫 這兩個方法的返回結果不具有唯一性
// 自定義類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
方法不要求一定生成不同的整數結果。但是,為不相等的物件生成不同整數結果可以提高雜湊表的效能。