如何在Java中比较两个HashMap



我需要用Java比较两个HashMap。 我尝试使用 equals(( 方法,但这不起作用。 我想,也许,这就是为什么在 HashMap equals(( 方法中使用对象引用进行比较,而不是对象值。 例:

/*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)); //THIS RETURNS FALSE (SHOULD BE TRUE)

实际上,您说HashMapequals方法是通过引用而不是值进行比较是不对的。equals方法继承自AbstractMap,后者将 equals 方法定义如下:

实现首先检查指定的对象是否是此映射; 如果是这样,则返回 true。然后,它检查指定的对象是否为 大小与此地图大小相同的地图;如果没有,它 返回假。如果是这样,它将遍历此映射的 entrySet 集合, 并检查指定的映射是否包含此映射的每个映射 包含。如果指定的映射无法包含此类映射,则为 被返回。如果迭代完成,则返回 true。

来源: https://docs.oracle.com/javase/7/docs/api/java/util/AbstractMap.html#equals(java.lang.Object(

正如注释所建议的那样,请确保类的hashCodeequals方法正确。

最新更新