java HashMap - 如何检索两个元素

java HashMap - how to retrieve both elements

考虑程序的一部分:-

HashMap<Object,Object> m1=new HashMap<Object,Object>();
Person p1=new Person("Raj","Sharma");
Person p2=new Person("Raj","Sharma");
m1.put(p1,"11");
m1.put(p2,"22");

Also Person class have overridden hashCode() method but no equals() method

我所知道的是:由于两者具有相同的键(p1 和 p2 产生相同的哈希码),因此它们对应于相同的索引,因此在将 p1 存储在该索引中之后,当它尝试将 p2 放入 JVM 时会发现两者都有相同的 hashCode,因此再次对 p2 进行哈希处理并生成新索引并将 22 存储在该索引上。

现在,如果我们尝试使用键 p1 或 p2 检索元素,

String temp=(String)m1.get(p1);     // 11

它会 return 11 只有这样我们如何检索元素 22?

你还需要覆盖 Person 的 equals 方法。当尝试检索值时,哈希码将用于计算要在哪个存储桶中搜索,但随后将使用 equals 方法检查传入的键是否与存储值的键完全匹配。

使用基于散列的集合时,必须覆盖 Java 中的等号和散列码。请在此处参考 equals override contract。

http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals(java.lang.Object)

如果您的 Person class 覆盖了 hashCode 和 equals,因此 p1.equals(p2) 为真且 p1.hashCode()==p2.hashCode(),您无法从Map,因为 HashMap 不允许重复键。

因此 m1.put(p2,"22"); 会将值“11”替换为“22”。在这种情况下,m1.get(p1)m1.get(p2) 都将 return "22".

Also Person class have overridden hashCode() method but no equals() method

我错过了那句话。如果不覆盖equals,p1 和p2 不是同一个键,即使它们具有相同的hashCode。 m1.get(p1) 将 return “11”,m1.get(p2) 将 return “22”。