我有一个枚举类如下。
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 ,我注意到 hashCode
和 equals
的实现实际上是来自 Object
的实现。但这些是合理的,因为枚举值的不可实例化。
如果您不能创建枚举值的新实例,使用这些默认值没有问题:
- 枚举值必须具有与其自身相同的哈希码值(该值是什么无关紧要);
- 枚举值必须等于其自身,而不是任何其他值,即身份相等。
关于java - 我们是否必须为放在 HashMap 中的枚举覆盖 equals/hashcode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45907878/