如何实现仅以Snake类的head属性作为Map键匹配依据的功能?
解决方法:重写
Snake类的equals()和hashCode()方法 嘿,要让Snake作为HashMap的键时只依据head属性匹配,核心是搞定HashMap判断键是否相等的逻辑——它是先通过hashCode()的返回值判断哈希值是否一致,再用equals()确认内容是否相等的。所以我们要让这两个方法都只依赖head属性。
修改后的完整Snake类代码
public class Snake { private int head; private int tail; public Snake(int head, int tail) { super(); this.head = head; this.tail = tail; } // 重写hashCode,仅基于head计算哈希值 @Override public int hashCode() { return Integer.hashCode(head); } // 重写equals,仅比较head属性 @Override public boolean equals(Object obj) { // 先判断是否是同一个对象 if (this == obj) return true; // 空值或类型不同直接返回false if (obj == null || getClass() != obj.getClass()) return false; // 强制类型转换后比较head Snake snake = (Snake) obj; return head == snake.head; } // 可选:添加getter方法方便后续操作 public int getHead() { return head; } public int getTail() { return tail; } }
效果验证示例
当你使用这个修改后的类时,只要head相同,不管tail是什么,都会被HashMap视为同一个键,自动覆盖原有值,避免重复:
Map<Snake, Integer> map = new HashMap<>(); map.put(new Snake(1, 2), 100); map.put(new Snake(1, 3), 200); // 这个会替换掉上面的键值对 System.out.println(map.size()); // 输出1,因为两个Snake被判定为同一个键
关键说明
- 必须同时重写
hashCode()和equals():这是Java的约定——如果两个对象equals()返回true,它们的hashCode()必须相等;反之,hashCode()相等的对象equals()不一定相等(但这里我们让两者都依赖head,刚好满足需求)。 - 注意场景影响:重写后,所有判断
Snake对象相等的地方都会只看head,如果你的代码其他地方需要同时比较head和tail,可能需要额外处理(比如单独写一个比较方法)。
内容的提问来源于stack exchange,提问作者Dawson Smith
相关产品推荐
相关产品推荐

