考虑一部分程序: -
>> 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 ??
答案 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)