当插入重复键时,我对 Java HashMap 有一个非常基本的疑问。
我的意图是创建 4 个 Emp 对象。2 个对象(e1 和 e2)具有相同的 hashCode。因此,当插入 e1(在 e2 之后插入)时,hashmap 会意识到已经存在具有相同哈希值的对象(对象 e2)。然后它将槽中所有对象的键与相同的哈希值进行比较。如果它找到一个具有匹配键的对象(通过调用下面 Emp 类的 equals 方法),它将用新值替换旧值。
请看下面的测试代码:
import java.util.Map;
import java.util.HashMap;
import java.util.Set;
class Emp {
String name;
int age;
public Emp(String name, int age) {
this.name = name;
this.age = age;
}
public boolean equals(Object s) {
if(s instanceof Emp) {
Emp s1 = (Emp) s;
return ((s1.name.compareToIgnoreCase(this.name) == 0));
}
return false;
}
public int hashCode() {
//return (this.name.hashCode() + this.age);
return this.name.hashCode();
}
}
public class HashTest {
public static void main(String[] args) {
Emp e1 = new Emp("Terry", 26);
Emp e2 = new Emp("Terry" , 60);
Emp e3 = new Emp("John", 21);
Emp e4 = new Emp("Test", 60);
Map<Emp,Emp> emp = new HashMap<Emp, Emp>();
emp.put(e2,e2);
Emp v2 = emp.put(e1,e1);
emp.put(e3,e3);
emp.put(e4,e4);
System.out.println("Replaced Record Name: " + v2.name + " , age: " + v2.age);
for(Emp e: emp.keySet())
System.out.println("Name: " + e.name + " , age: " + e.age);
}
}
我期待的输出: 替换记录名称:特里,年龄:60 名称:测试,年龄:60 名称:特里,年龄:26 名称:约翰,年龄:21
我得到的输出: Replaced Record Name: Terry , age: 60 Name: Test , age: 60 Name: Terry , age: 60 Name: John , age: 21
我期待 (Terry, 60) 被 (Terry, 26) 对象取代。这似乎正在发生,因为我得到Replaced Record Name: Terry, age: 60作为输出。但是,地图包含记录Name: Terry , age: 60而不是Name: Terry , age: 26。
编辑:谢谢大家的建议。事实证明我犯了一个非常粗心的错误。我没有打印与键关联的值,而是仅打印键。
正如每个人都指出的那样,解决方案是:
for(Emp e: emp.keySet())
{
Emp empVal = emp.get(e);
System.out.println("Name: " + empVal.name + " , age: " + empVal.age);
}