【问题标题】:Do we have to override equals/hashcode for enums which are put in a hashmap我们是否必须为放入哈希图中的枚举覆盖 equals/hashcode
【发布时间】:2018-02-05 01:36:26
【问题描述】:

我有一个枚举类如下。

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>();

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

【问题讨论】:

标签: java hash hashmap equals hashcode


【解决方案1】:

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

即使你想,你也做不到,因为这些方法在枚举中是final

而且,不要将HashMap 与枚举键类型一起使用:使用EnumMap,它专门用于枚举键,并且不使用hashCodeequals(它实际上使用ordinal )。


编辑:阅读What is the reason behind Enum.hashCode 后,我注意到hashCodeequals 的实现实际上是来自Object 的实现。但是这些是合理的,因为枚举值是不可实例化的。

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

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

【讨论】:

  • 但是如果 Item 是一个类,那么我们必须重写 hashcode 和 equals 以便它们在 Map 中工作。那么将其更改为枚举有什么不同呢?
  • 所有枚举都是Enum 的子类。这个类提供了equalshashCode的最终实现
猜你喜欢
  • 2013-06-02
  • 2018-08-05
  • 2018-07-13
  • 1970-01-01
  • 1970-01-01
  • 2020-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多