java - 我们是否必须为放在 HashMap 中的枚举覆盖 equals/hashcode

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

我是否需要覆盖 inventory.put()inventory.get() 的枚举 Item 类中的 hashcode 和 equals 以好好工作?如果不是,为什么?

最佳答案

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

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

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


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

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

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

关于java - 我们是否必须为放在 HashMap 中的枚举覆盖 equals/hashcode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45907878/

相关文章:

java - Spring-Boot REST 服务基本 http auth 排除一个端点

java - JDK是否缺少某些源文件?

java - Mockito 的 spy 功能失败

ruby - 如何基于 ruby​​ 中的相同键合并散列数组?

java - java语言如何将字符串解析成hashmap

Java:通过键从 Hashmap 获取对象

java - 如何修改实体管理器的查询缓存?

perl - 如何通过多个键对 perl 哈希进行排序?

perl - 我如何查看 Perl 哈希是否已经有某个键?

java - 有效地找到匹配的对象对