为什么HashCode()函数会生成错误

  • 本文关键字:错误 函数 HashCode java
  • 更新时间 :
  • 英文 :

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(由于计数为0,这将产生算术异常,但我不知道(c(和(d(的平均值。为什么它们是错误的?

这是Object.hashCode的一般合同。问题基本上是问您哪些选择符合一般合同。

  • 每当在执行Java应用程序时多次在同一对象上调用它时,HashCode方法必须始终如一 返回相同的整数,没有提供等于 修改对象上的比较。这个整数不必保留 从一个执行应用程序到另一个执行 同一应用程序。

  • 如果根据等价(对象(方法相等,则在两个对象中的每个对象上调用哈希码方法 产生相同的整数结果。

  • 不需要,如果两个对象根据等于(java.lang.object(方法不等,那么在 两个对象中的每个对象都必须产生不同的整数结果。 但是,程序员应意识到,产生独特的 整数结果不平等物体可能会提高性能 哈希表。

您对为什么B不正确的理解是正确的。C和D是不正确的,因为它们不能满足第二点。也就是说,它们不与equals一起使用。

如您所见,如果count S不是0,则equals方法比较平均值,否则比较了count s。

选项C同时考虑了计数和累积,因此(累积:6,计数:2(和(累积:3,计数:1(具有不平等的哈希代码,但被equals等于<<<<<<

选项D仅考虑累积的考虑,因此(累积:6,count:2(和(累积:3,计数:1(将具有不平等的哈希代码,但equals将其视为同等。

选项A是一个奇怪的选择。它返回一个恒定整数。这意味着所有对象都将具有相同的哈希代码。尽管一般合同不需要为不同对象具有不同的哈希代码(请参见第3点(,但很少有用。

最新更新