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”。
考虑程序的一部分:-
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”。