自定义枚举类 Enum 是否可以作为 HashMap 的key?针对这个问题,我们的答案是肯定的,至于为什么我们做如下分析。
1、Enum 为常量
自定义的枚举类为常量,我们说一个类为常量,就像是 java.lang.String 类一样,属于final的类。
2、自定义测试 Enum 类
1 2 3 4 5 6 |
/** * Created by 791202.com on 2016/11/7. */ public enum OrderStatusEnum { SUCCESS; } |
3、反编译枚举类
3.1、执行:javap -v ClassName 命令
1 |
D:\workspace_git_2\jd-ssm-stu\jd-ssmman-web\target\test-classes\com\jd\beans>javap -v OrderStatusEnum |



3.2、总结
- 自定义的Enum类被编译器优化为final类,类似于String的常量类
- 自定义的Enum类继承自 java.lang.Enum 类
- 语法糖,自定义枚举通过反编译可以看到该类添加了 values()、valueOf()方法。
- equals、hashCode 已经被重写。
通过以上的反编译,我们可以看到最终编译器把我们的自定义Enum类都继承了 java.lang.Enum 类,在这个类里面已经重写了Object类的 equals、hashCode,所以说我们可以放心将 Enum 用于Map的key。
4、java.lang.Enum 源代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/** * Returns true if the specified object is equal to this * enum constant. * * @param other the object to be compared for equality with this object. * @return true if the specified object is equal to this * enum constant. */ public final boolean equals(Object other) { return this==other; } /** * Returns a hash code for this enum constant. * * @return a hash code for this enum constant. */ public final int hashCode() { return super.hashCode(); } |
0