【发布时间】:2019-04-08 22:24:22
【问题描述】:
我(至少)有两个类实现了相同的接口并具有相同的字段。如果这两个类的字段相同或应该不同,那么这两个类是否具有相同的哈希码?这段代码可以吗?
interface Base { }
class A implements Base {
private Integer value;
public A(Integer value) { this.value = value; }
public int hashCode() { return value.hashCode(); }
}
class B implements Base {
private Integer value;
public B(Integer value) { this.value = value; }
public int hashCode() { return value.hashCode(); }
}
【问题讨论】:
-
为什么会有两个类呢?
-
如果对他们俩都有意义的话,他们可以拥有类似的
hashCode实现。虽然从你的问题来看,这两个类的目的有点不清楚。 -
hashCode的唯一要求是A.equals(B) ==> A.hashCode() == B.hashCode()。另外:您应该始终同时修改hashCode和equals以保持该要求......显然这样做会产生影响。例如 Python 对数字类执行此操作,以便整数1等于浮点1.0,但这意味着如果您有类似{1: "a"}的映射,那么您可以使用1.0代替1来获取该值并且您不能同时将1和1.0作为键,因为它们对于哈希映射实际上是相同的 -
我会说,这当然不是问题。可能发生的最糟糕的事情:在包含两个类的实例的
Map或Set中出现更多哈希冲突。但是您也可以将类本身的哈希码添加到实例的哈希码中。
标签: java