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点(,但很少有用。