Java中自定义getKey()函数无法运行的原因排查求助
问题分析与解决方案
我一眼就看到你的代码里有两个关键问题,咱们一个个拆解:
1. 迭代器next()被重复调用,导致逻辑完全错误
你在循环里两次调用了it.next():第一次是history_map.get(it.next())用来取值,第二次是return it.next()想返回匹配的键。但要知道,每次调用next()都会让迭代器移动到下一个元素,这就会导致:
- 如果第一个元素的值匹配,你返回的却是第二个元素的键,完全不符合预期
- 如果是最后一个元素匹配,第二次调用
next()会直接抛出NoSuchElementException
修正方法
把it.next()的结果存到一个变量里,只调用一次:
private ArrayList<String> getKey(String value) { Iterator<ArrayList<String>> it = history_map.keySet().iterator(); while (it.hasNext()) { ArrayList<String> currentKey = it.next(); // 仅调用一次next(),保存当前键 if (history_map.get(currentKey).equals(value)) { return currentKey; // 返回当前匹配的键 } } return null; }
如果是Java 8及以上版本,还可以用更简洁的流式写法:
private ArrayList<String> getKey(String value) { return history_map.keySet().stream() .filter(key -> value.equals(history_map.get(key))) .findFirst() .orElse(null); }
2. 用ArrayList作为HashMap的键存在潜在风险
ArrayList是可变集合,它的equals()和hashCode()方法是基于内部元素计算的。如果你的history_map中的ArrayList键在存入后被修改过(比如添加/删除元素),它的哈希值会发生变化,导致HashMap无法正确定位到这个键,即使值匹配也找不到对应的键。
优化建议
如果可以的话,尽量使用不可变集合作为HashMap的键,比如:
- 用
Collections.unmodifiableList()包装你的ArrayList后再存入HashMap - 使用Guava库的
ImmutableList(如果项目允许引入依赖) - 自己保证作为键的
ArrayList在存入后永远不会被修改
内容的提问来源于stack exchange,提问作者molamola
相关产品推荐
相关产品推荐

