-2
class EventManager{
    public String unique_ID;
    public List<Object> infoList;

    public EventManager(String ID, List<Object> infoList){
        this.unique_ID = ID;
        this.infoList = infoList;
    }
}

如果这个类使用映射键,我是否需要实现自己的 hashcode 和 equal() 方法?

如果需要,只需散列 unique_ID 就足够了?谢谢。

谢谢。

4

3 回答 3

1

如果您不定义自己的哈希码,我相信它会使用对象的地址。因此,如果您创建两个具有相同 id 的实例,它们将不会散列到同一个存储桶。您可能想使用 id 来表示相等。作为旁注,请确保不要在相等或散列中使用列表,除非您可以保证不变性。

默认 .equals 和 .hashCode 将如何适用于我的课程?

于 2013-04-14T22:12:59.323 回答
0

除非您想覆盖hashCodeand equals 的值以赋予它们不同的behaviour.

如果没有,您可以只使用默认值,并且每个不同的对象将有不同hashCode的 JVM 或多或少地保证。

您只需要覆盖equals,例如,如果您希望能够说两个对象在某些条件满足时是相同的(例如,只是unique_ID相同)。

如果你override equals,那么你必须override hashCode,以尊重 Object 契约:

Object 类的 equals 方法实现了对象上最有区别的可能等价关系;也就是说,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象(x == y 的值为 true)时,此方法才返回 true。

请注意,每当重写该方法时,通常都需要重写 hashCode 方法,以维护 hashCode 方法的一般约定,即相等的对象必须具有相等的哈希码。

http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals(java.lang.Object)

于 2013-04-14T22:04:17.077 回答
0

请理解,如果您不覆盖 equals,那么只有当它们实际上是 SAME 实例(即,相等的地址)时,两个实例才会相等。如果您希望包含相等字段的实例被视为相等,您需要实现自己的版本。

如果您覆盖 equal,那么您也必须覆盖 hashcode,以确保两个相等的实例返回相同的 hashcode。不这样做将导致 HashMap 等失败。

请注意,哈希码始终返回 6 或其他一些固定值是完全合法的(尽管很愚蠢)。它不能做的是为相等的实例返回两个不同的哈希码值。

于 2013-04-14T22:08:51.580 回答