java HashMap - 如何检索这两个元素

时间:2015-07-04 06:11:41

标签: java hash hashmap

考虑一部分程序: -

>> out{1}

ans = 

    [1]    [         2]
    [2]    [2x1 double]
    [3]    [         5]
    [5]    [         6]
    [7]    [         8]

>> out{2}

ans = 

    [1]    [2x1 double]
    [2]    [         4]

>> celldisp(out{1}(2,:))

ans{1} =

     2

ans{2} =

     4
     8

>> celldisp(out{2}(1,:))

ans{1} =

     1

ans{2} =

     2
     7
  

Person类也覆盖了hashCode()方法但没有重写equals()方法

我所知道的是:由于两者都有相同的密钥(p1和p2产生相同的哈希码),因此它们对应相同的索引,所以在将p1存储在该索引中之后,当它尝试把p2 JVM看到两者都有相同的hashCode ,所以再次对p2进行散列并生成新索引,并将22存储在该索引上。

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

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");

它只返回11然后我们如何检索元素22 ??

2 个答案:

答案 0 :(得分:2)

如果您的Person类重写了hashCode和equals,那么p1.equals(p2)为真且p1.hashCode()==p2.hashCode(),则无法从Map中检索“11”和“22”,因为HashMap没有t允许重复的密钥。

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

  

Person类也覆盖了hashCode()方法但没有重写equals()方法

我错过了这句话。如果不覆盖equals,则p1和p2不是相同的密钥,即使它们具有相同的hashCode。 m1.get(p1)将返回“11”,m1.get(p2)将返回“22”。

答案 1 :(得分:1)

您还需要覆盖Person的equals方法。当尝试检索值时,hashcode将用于计算要搜索的存储区,但是equals方法将用于检查传入的密钥是否与存储该值的密钥完全匹配。

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

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