Java遍历HashMap匹配外部Key对象时相等判定失效如何解决
问题原因
Java中==运算符对于引用类型(比如你自定义的Point类)的对比逻辑是判断两个变量是否指向内存中的同一个对象,而非对比对象内部的属性值是否相等。你当前遍历拿到的point对象和outsidePoint是两个不同的内存实例,哪怕x、y属性完全一致,==判断也会返回false。
另外HashMap的Key匹配逻辑会先校验两个对象的hashCode值是否相等,再校验equals返回结果,两个条件同时满足才会判定为同一个Key,所以你需要同时处理两个方法的重写逻辑。
解决方法
- 重写Point类的
equals()方法和hashCode()方法
基于x、y两个属性实现判断逻辑,保证属性值相等的Point对象哈希值一致、equals返回true:public class Point { private int x; private int y; // 原有构造方法、getter、setter等逻辑保持不变 @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Point point = (Point) o; return x == point.x && y == point.y; } @Override public int hashCode() { return Objects.hash(x, y); } } - 修改判断逻辑,用
equals()替换==
调整你的遍历代码中的判断条件:for (HashMap.Entry<Point, Character> entry : map.entrySet()) { Point point = entry.getKey(); if(point.equals(outsidePoint)){ //insert code here } }
额外优化说明
你原有代码里Point point = new Point(0,0);是冗余逻辑,后续你直接将entry.getKey()赋值给point变量,之前new的Point对象会被直接丢弃,没有任何作用,可以直接删除。
内容的提问来源于stack exchange,提问作者Jamo Kisor
相关产品推荐
相关产品推荐

