如何在Java中比较两个HashMap?equals方法返回错误结果求解
问题分析与解决方案
你遇到的问题核心在于**Posto类没有重写equals()和hashCode()方法**,并不是HashMap的equals()逻辑本身有问题。
为什么当前代码返回false?
HashMap的equals()方法会逐一比对两个Map中的键值对:
- 键是
String类型,它已经重写了equals()方法,所以键的比对是正常的; - 但值是
Posto对象,默认使用Object类的equals()——这个方法是比较对象的内存引用,而非对象内容。你创建的p1和p5是两个独立的对象实例,哪怕它们的code和cat属性完全一致,默认equals()也会判定它们不相等,最终导致整个HashMap的equals()返回false。
解决方法:重写Posto类的equals()和hashCode()
要让HashMap的equals()按内容比对值,你需要在Posto类中重写这两个方法,基于对象的属性来定义相等性。
修改后的Posto类示例:
import java.util.Objects; public class Posto { private String code; private String cat; // 构造方法 public Posto(String code, String cat) { this.code = code; this.cat = cat; } // Getter方法 public String getCode() { return code; } public String getCat() { return cat; } // 重写equals(),基于属性判断相等 @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Posto posto = (Posto) o; return code.equals(posto.code) && cat.equals(posto.cat); } // 重写hashCode(),保证相等对象的哈希值一致 @Override public int hashCode() { return Objects.hash(code, cat); } }
验证修改后的效果
使用上面的Posto类后,再运行你原来的比较代码:
/*FIRST HASHMAP*/ Posto p1 = new Posto("005","Cat1"); Posto p2 = new Posto("001", "Cat2"); Posto p3 = new Posto("009", "Cat2"); Posto p4 = new Posto("005","Cat3"); Map<String, Posto> posti = new HashMap<String, Posto>(); posti.put(p1.getCode(), p1); posti.put(p2.getCode(), p2); posti.put(p3.getCode(), p3); posti.put(p4.getCode(), p4); /*SECOND HASHMAP*/ Posto p5 = new Posto("005","Cat1"); Posto p6 = new Posto("001", "Cat2"); Posto p7 = new Posto("009", "Cat2"); Posto p8 = new Posto("005","Cat3"); Map<String, Posto> pos = new HashMap<String, Posto>(); pos.put(p1.getCode(), p5); pos.put(p2.getCode(), p6); pos.put(p3.getCode(), p7); pos.put(p4.getCode(), p8); /*COMPARE*/ System.out.println(posti.equals(pos)); // 现在会返回TRUE
额外提示
- 按照Java规范,只要重写
equals()就必须重写hashCode(),否则会导致对象在哈希集合(如HashMap、HashSet)中出现查找、存储异常; - 可以直接用IDE的自动生成功能(比如IntelliJ的
Alt+Insert、Eclipse的Source菜单)来生成标准的equals()和hashCode()方法,避免手动编写出错。
内容的提问来源于stack exchange,提问作者Gaetano de Gennaro
相关产品推荐
相关产品推荐

