【发布时间】:2015-01-30 10:59:30
【问题描述】:
考虑示例代码:
class EmployeeClass {
int id;
public EmployeeClass(int eid) {
this.id=eid;
}
@Override
public int hashCode(){
return this.id;
}
@Override
public boolean equals(Object o){
return true;
}
}
public class HashcodeAndEquals {
public static void main(String[] args) {
Map map=new HashMap();
EmployeeClass e1=new EmployeeClass(1);
map.put(e1, "Employee 1"); // line 1
EmployeeClass e2=new EmployeeClass(2);
map.put(e2, "Employee 2");
EmployeeClass e3=new EmployeeClass(3);
EmployeeClass e4=new EmployeeClass(1); // line 2
EmployeeClass e5=new EmployeeClass(1);
map.put(e5, "Employee 5"); // line 3
System.out.println("e1 -> "+map.get(e1));
System.out.println("e2 -> "+map.get(e2));
System.out.println("e3 -> "+map.get(e3));
System.out.println("e4 -> "+map.get(e4)); // line 4
System.out.println("e5 -> "+map.get(e5));
}
}
输出:
e1 -> Employee 5
e2 -> Employee 2
e3 -> null
e4 -> Employee 5
e5 -> Employee 5
第 1 行运行后,第 3 行覆盖 e1 的值,但我的 equals 方法仅返回 true。同样在第 4 行,我们得到了 e4 的值,即使 equals 方法只返回 true。由于equals 方法没有比较只返回true,所以put 和get 在这里是如何工作的。幕后发生了什么?
【问题讨论】:
-
你可以用调试器找出来吗?
-
你对什么感到惊讶?键 e1、e4 和 e5 是等价的,因此它们指向相同的值。
-
明白了。问之前一定用过。无论如何 gr8 帮助。
标签: collections map hashmap equals hashcode