You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java遍历HashMap匹配外部Key对象时相等判定失效如何解决

问题原因

Java中==运算符对于引用类型(比如你自定义的Point类)的对比逻辑是判断两个变量是否指向内存中的同一个对象,而非对比对象内部的属性值是否相等。你当前遍历拿到的point对象和outsidePoint是两个不同的内存实例,哪怕x、y属性完全一致,==判断也会返回false。

另外HashMap的Key匹配逻辑会先校验两个对象的hashCode值是否相等,再校验equals返回结果,两个条件同时满足才会判定为同一个Key,所以你需要同时处理两个方法的重写逻辑。

解决方法

  1. 重写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);
        }
    }
    
  2. 修改判断逻辑,用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 06:54:05