繁体   English   中英

我们是否必须重写放入哈希图中的枚举的equals / hashcode

[英]Do we have to override equals/hashcode for enums which are put in a hashmap

我有一个枚举类,如下所示。

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;
}
}

和哈希图定义如下

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

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

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

而且即使您愿意,也不能这样做,因为这些方法在枚举中是final的。

但是,也不要使用枚举键类型的HashMap :使用EnumMap ,它专门用于枚举键,并且不使用hashCodeequals (它实际上使用ordinal )。


编辑:在阅读Enum.hashCode背后的原因之后 ,我注意到hashCodeequals的实现实际上是Object 但这合理的,因为枚举值的不稳定性。

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

  • 枚举值必须具有与其自身相同的哈希码值(该值是什么都无关紧要);
  • 枚举值必须等于自己,而不等于其他任何值,即相等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM