自定义枚举类 Enum 是否可以作为 HashMap 的key?针对这个问题,我们的答案是肯定的,至于为什么我们做如下分析。
1、Enum 为常量
自定义的枚举类为常量,我们说一个类为常量,就像是 java.lang.String 类一样,属于final的类。
2、自定义测试 Enum 类
/**
* Created by wangyingjie1 on 2016/11/7.
*/
public enum OrderStatusEnum {
SUCCESS;
}
3、反编译枚举类
3.1、执行:javap -v ClassName 命令
D:\workspace_git_2\jd-ssm-stu\jd-ssmman-web\target\test-classes\com\jd\beans>javap -v OrderStatusEnum
3.2、操作过程截图
3.3、总结
(1)、自定义的Enum类被编译器优化为final类,类似于String的常量类
(2)、自定义的Enum类继承自 java.lang.Enum 类
(3)、语法糖,自定义枚举通过反编译可以看到该类添加了 values()、valueOf()方法。
(4)、equals、hashCode 已经被重写。
通过以上的反编译,我们可以看到最终编译器把我们的自定义Enum类都继承了 java.lang.Enum 类,在这个类里面已经重写了Object类的 equals、hashCode,所以说我们可以放心将 Enum 用于Map的key。
4、java.lang.Enum 源代码:
/**
* 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();
}