我是否需要创建自己的哈希和相同的方法?

时间:2013-04-14 22:01:40

标签: java hash key

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即可?感谢。

感谢。

3 个答案:

答案 0 :(得分:1)

如果你没有定义自己的哈希码,我相信它会使用对象的地址。因此,如果您创建具有相同ID的两个实例,则它们不会散列到同一个存储桶。您可能希望使用id进行相等。作为旁注,请确保在您的平等或散列中不使用List,除非您能保证不可变性。

How default .equals and .hashCode will work for my classes?

答案 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或其他固定值是完全合法的(尽管很愚蠢)。 必须做的是为相同的实例返回两个不同的哈希码值。