class EventManager{
public String unique_ID;
public List<Object> infoList;
public EventManager(String ID, List<Object> infoList){
this.unique_ID = ID;
this.infoList = infoList;
}
}
如果这个类使用了map键,我是否需要实现自己的hashcode和equal()方法?
如果需要,只需散列unique_ID即可?感谢。
感谢。
答案 0 :(得分:1)
如果你没有定义自己的哈希码,我相信它会使用对象的地址。因此,如果您创建具有相同ID的两个实例,则它们不会散列到同一个存储桶。您可能希望使用id进行相等。作为旁注,请确保在您的平等或散列中不使用List,除非您能保证不可变性。
答案 1 :(得分:0)
除非您要覆盖hashCode
的值并且等于给予他们不同的behaviour
,否则不会。
如果没有,您可以使用默认值,并且每个不同的对象将具有不同的hashCode
,其方式或多或少由JVM保证。
例如,如果您希望能够说某些条件满足时两个对象相同(例如,只有equals
相同),则只需覆盖unique_ID
。
如果您执行覆盖equals
,那么您必须覆盖hashCode
,以尊重对象合同:
类Object的equals方法实现最具辨别力 对象可能的等价关系;也就是说,对于任何非null 引用值x和y,当且仅当x时,此方法返回true 和y引用相同的对象(x == y的值为true)。
请注意,通常需要覆盖hashCode方法 每当重写此方法时,都要保持一般 hashCode方法的契约,它声明了相等的对象必须 有相同的哈希码。
http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals(java.lang.Object)
答案 2 :(得分:0)
理解如果你不重写equals那么两个实例只有在它们实际上是SAME实例(即相等的地址)时才相等。如果您希望将包含相等字段的实例视为相等,则需要实现自己的版本。
如果覆盖相等,则必须覆盖哈希码,以确保两个相等的实例返回相同的哈希码。如果不这样做,将导致HashMap等失败。
请注意,哈希码始终返回6或其他固定值是完全合法的(尽管很愚蠢)。 必须做的是为相同的实例返回两个不同的哈希码值。