HashMap<Ist,Ist>根据值获取键返回null问题求助
分析HashMap按值找键返回null的可能原因
我来帮你梳理下几个最可能导致这个问题的原因,都是Java里使用HashMap时容易踩的坑:
1. Ist类未正确重写equals()和hashCode()方法
这是最常见的原因!HashMap中判断值是否相等,依赖的是对象的equals()方法。如果Ist类没有重写equals(),默认会使用Object类的实现——也就是比较对象的内存地址。
哪怕你的istOrigen和istDestino逻辑上是同一个实体(比如属性完全一致),只要它们是不同的对象实例,Objects.equals(value, entry.getValue())就会返回false,自然找不到对应的键。
解决办法:给Ist类重写equals()和hashCode()方法,根据类里的核心标识属性(比如唯一ID、业务主键等)来实现这两个方法。比如:
@Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Ist ist = (Ist) o; return Objects.equals(id, ist.id); // 假设id是核心标识字段 } @Override public int hashCode() { return Objects.hash(id); }
2. istDestino与存入的istOrigen逻辑上并不相等
你可能误以为这两个对象是同一个值,但实际上它们的属性存在差异。比如某个字段的值不一样,导致equals()判断不通过。
排查方式:
- 直接调用
istOrigen.equals(istDestino),看返回结果是不是false; - 打印两个对象的所有属性值,对比找出差异点。
3. HashMap中根本不存在值为istDestino的条目
有可能是你的put操作没有成功存入预期的条目,或者后续条目被覆盖了:
- 检查
registro.put(origenCopia, istOrigen)执行后,registro.containsValue(istOrigen)是否返回true; - 打印
registro.entrySet(),确认里面确实包含你预期的键值对; - 排查是否有其他代码在你调用
getKeyByValue之前,修改了registro里的内容(比如删除了条目、覆盖了值)。
调试小技巧
可以在getKeyByValue方法里加临时日志,帮你定位问题:
public static <T, E> T getKeyByValue(Map<T, E> map, E value) { for (Map.Entry<T, E> entry : map.entrySet()) { System.out.println("当前条目value: " + entry.getValue()); System.out.println("要匹配的value: " + value); System.out.println("equals结果: " + Objects.equals(value, entry.getValue())); if (Objects.equals(value, entry.getValue())) { return entry.getKey(); } } return null; }
内容的提问来源于stack exchange,提问作者Abrelaboca
相关产品推荐
相关产品推荐

