【发布时间】:2017-01-25 05:09:23
【问题描述】:
我有一个类Employee,比方说,我的这个类的hashCode 函数真的很糟糕(假设它总是返回一个常量)。我的代码如下所示。
public class Employee {
private String name;
public Employee(String name) {
this.name = name;
}
@Override
public int hashCode() { return 1; }
@Override
public boolean equals(Object object) {
if(null == object || !(object instanceof Employee)) {
return false;
}
Employee other = (Employee)object;
return this.name.equals(other.name);
}
}
假设我想使用Employee 作为Map 中的键,所以我可以执行以下操作。
public static void main(String[] args) {
Map<Employee, Long> map = new HashMap<>();
for(int i=0; i < 1000; i++) {
map.put(new Employee("john"+i, 1L));
}
System.out.println(map.size());
}
为什么当我运行这段代码时,我总是得到 1,000 作为大小?
使用Employee 作为键似乎在以下意义上是“好”的。
- 它是不可变的
-
equals的两个员工始终生成相同的哈希码
我的预期是因为hashCode 的输出总是1,那么map.size() 应该总是1。但事实并非如此。为什么?如果我有一个Map<Integer,Integer>,然后是map.put(1, 1),然后是map.put(1, 2),我只希望大小为1。
equals 方法一定会在这里发挥作用,但我不确定如何。
任何指针表示赞赏。
【问题讨论】:
标签: java collections hashmap hashcode equality