我们是否必须为放在hashmap中的枚举重写equals / hashcode

时间:2017-08-27 18:05:33

标签: java hash hashmap equals hashcode

我有一个枚举类如下。

public enum Item {
   COKE("Coke", 25), PEPSI("Pepsi", 35), SODA("Soda", 45);
   private String name;
   private int price;

private Item(String name, int price) {
    this.name = name;
    this.price = price;
}

public String getName() {
    return name;
}

public long getPrice() {
    return price;
}
}

和一个定义如下的hashmap

private Map<Item, Integer> inventory = new HashMap<Item, Integer>();

我是否需要在Iteminventory.put()的枚举inventory.get()类中覆盖哈希码和等号才能正常工作?如果没有,为什么?

1 个答案:

答案 0 :(得分:6)

不,你不是。为什么?因为已经提供了这些方法的合理实现。

即使您愿意,也不能,因为这些方法在枚举中为final

但是,不要将HashMap与枚举密钥类型一起使用:使用专用于枚举密钥的EnumMap,并且不使用hashCodeequals(它实际上使用ordinal)。

修改:在阅读What is the reason behind Enum.hashCode后,我注意到hashCodeequals的实施实际上来自Object。但是这些 是合理的,因为枚举值不具有实例性。

如果您无法创建枚举值的新实例,则使用这些默认值没有问题:

  • 枚举值必须与自身具有相同的哈希码值(并且它与该值无关);
  • 枚举值必须等于自身,而不是任何其他值,即按身份相等。