直到现在我对hashmap内部工作非常清楚。但是看到下面的代码片段,我有点困惑。
在以下代码中,我的类的equals()
方法始终返回false。因此,我希望HashMap.get()
永远不会找到该类的关键字。
有人可以解释一下。在get方法中,我知道它会计算哈希码,它会找到确切的桶但是等于返回false,它怎么能返回3?
package com.vikash.Theory.CollectionsFramework;
public class Emp {
private String firstName;
private String lastName;
public Emp(String firstName,String lastName) {
this.firstName=firstName;
this.lastName=lastName;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public int hashCode() {
return firstName.hashCode()+lastName.hashCode();
}
public boolean equals(Object o) {
return false;
}
}
public class Test {
public static void main(String[] args) {
Map<Object,Integer> map=new HashMap<Object,Integer>();
Emp e1=new Emp("Vikash","Mishra");
Emp e2=new Emp("Mishra","Vikash");
Emp e3=new Emp("Mishra","Vikash");
map.put(e1, 1);
map.put(e2, 2);
map.put(e3, 3);
/*e2.setFirstName("Vikash");
e2.setLastName("Mishra");*/
System.out.println("Size of the map is:"+map.size());
System.out.println(map.get(e3)); } }
答案 0 :(得分:2)
HashMap的源代码揭示了所有:
322 if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
323 return e.value;
在e.key == key
测试key.equals(e.key)
之前测试equals()
。
一般来说,有一个bug equals()
会导致Java中出现各种令人困惑的行为,所以避免这样做是非常明智的。 x.equals(x)
合同的一部分是true
应始终为setlocale(LC_TIME, 'fra_fra');
。
答案 1 :(得分:-2)
1)在你的hashcode()中你没有使用emp class的equals()方法
2)相反,你的hashcode()使用已经实现的String类的hashcode()BECAUSE firstname和lastname是string类型。
3)在你的情况下,即使两个键都相同,它们也会有不同的hashcode() 因为你没有定义当密钥相同时它们应该具有相同的hashcode()
4)equals()方法不是在hashcode()中自动调用的,而是必须显式调用以实现hashcode()并最终以 DESIRED WAY
的方式调用hashmap这就是我认为可能是甚至可以正常工作的原因 如果你有一个错误的equals()方法