簡體   English   中英

為什么 hashCode() 函數會產生錯誤

[英]Why does hashCode() function generate an error

import java.util.*;
public class Measurement {
int count;
    int accumulated;
    public Measurement() {}
    public void record(int v) {
        count++;
        accumulated += v;
    }
    public int average() {
        return accumulated/count;
    }
    public boolean equals(Object other) {
        if (this == other)
            return true;
        if (!(other instanceof Measurement))
            return false;
        Measurement o = (Measurement) other;
        if (count != 0 && o.count != 0)
            return average() == o.average();
        return count == o.count;
    }
    public int hashCode() {
        (1) INSERT CODE HERE 
    }
}

在 (1) 處插入哪些代碼將提供以下程序中hashCode()方法的正確實現? 選擇兩個正確答案。

(a) return 31337;

(b) return accumulated / count;

(c) return (count << 16) ^ accumulated;

(d) return ~accumulated;

(e) return count == 0 ? 0 : average();

正確答案是(a)和(e)。 (b) 是不正確的,因為 count 如果它是 0,它會產生一個算術異常,但我不知道 (c) 和 (d) 的平均值。 為什么他們是假的?

這是Object.hashCode一般契約 問題基本上是問您哪些選擇符合一般合同。

  • 每當在 Java 應用程序執行期間在同一對象上多次調用它時,hashCode 方法必須始終返回相同的整數,前提是對象上的 equals 比較中使用的信息沒有被修改。 該整數不需要從應用程序的一次執行到同一應用程序的另一次執行保持一致。

  • 如果根據 equals(Object) 方法兩個對象相等,則對兩個對象中的每一個調用 hashCode 方法必須產生相同的整數結果。

  • 如果根據 equals(java.lang.Object) 方法兩個對象不相等,則不需要對這兩個對象中的每一個調用 hashCode 方法必須產生不同的整數結果。 但是,程序員應該意識到為不相等的對象生成不同的整數結果可能會提高哈希表的性能。

您對 B 為何不正確的理解是正確的。 C 和 D 不正確,因為它們不滿足第二點。 也就是說,它們不適用於equals

如您所見,如果count s 都不為 0,則equals方法比較平均值,否則比較count s。

選項 C 同時考慮計數和累積,因此 (accumulated: 6, count: 2) 和 (accumulated: 3, count: 1) 將具有不相等的哈希碼,但會被equals視為相等。

選項 D 僅考慮累計,因此 (accumulated: 6, count: 2) 和 (accumulated: 3, count: 1) 將具有不相等的哈希碼,但會被equals視為相等。

選項A很奇怪。 它返回一個常量整數。 這意味着所有對象都將具有相同的哈希碼。 雖然一般合同不要求為不同的對象使用不同的哈希碼(見第 3 點),但這樣做很少有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM