Java中如何将Enum自定义value值设置为HashMap的key
问题根因
你的代码存在两处核心问题,直接导致存储的key和预期不符:
- 声明HashMap时指定key的泛型为
Question枚举类型,但调用put方法时传入的key是QUESTION_FIRST.getValue(),返回值是String类型,和声明的泛型类型完全不匹配。正常情况下这段代码无法通过编译,如果你是删除了泛型声明使用原生Raw Type绕过编译检查,后续Map出现类型混乱时,会默认读取枚举的name()返回值(也就是QUESTION_FIRST)作为实际存储的key。 - 如果你本身的需求是用枚举绑定的自定义字符串value作为key,那一开始声明Map泛型时就不应该把key类型设为
Question。
修复方案
根据实际业务需求二选一即可:
方案1:直接用枚举常量作为key(推荐)
枚举类型天生适合做Map key,不需要额外取自定义属性,直接传入枚举实例即可:
public void testMethod(){ Map<Question, Integer> map = new HashMap<>(); // 直接传入枚举常量作为key map.put(Question.QUESTION_FIRST, 1); // 取值时直接传入对应枚举即可 Integer result = map.get(Question.QUESTION_FIRST); }
最优实践:如果确定Map的key全是Question枚举值,优先用EnumMap替代HashMap,内存占用更低、查询效率更高,初始化方式为Map<Question, Integer> map = new EnumMap<>(Question.class);
方案2:用枚举绑定的自定义value字符串作为key
如果你确实需要把"firstQuestion"这类自定义字符串作为key,直接修改Map的key泛型为String即可:
public void testMethod(){ // 把key泛型从Question调整为String Map<String, Integer> map = new HashMap<>(); map.put(Question.QUESTION_FIRST.getValue(), 1); // 取值时传入对应自定义字符串即可 Integer result = map.get("firstQuestion"); }
注意:使用该方案需要保证所有枚举常量绑定的value属性全局唯一,否则会出现key互相覆盖的问题
内容的提问来源于stack exchange,提问作者Agniva
相关产品推荐
相关产品推荐

