以下代码示例的输出是:
{1 - e = e2,2 - e1 = e1}
package com.sid.practice;
import java.util.HashMap;
import java.util.Map;
public class InputOutputPractice
{
public InputOutputPractice()
{
}
public static void main(String[] args)
{
Employee e = new InputOutputPractice().new Employee(1, "e");
Employee e1 = new InputOutputPractice().new Employee(2, "e1");
Employee e2 = new InputOutputPractice().new Employee(1, "e2");
Map m = new HashMap();
m.put(e, "e");
m.put(e1, "e1");
m.put(e2, "e2");
System.out.println(m);
}
class Employee
{
public Employee(int id, String name)
{
this.id=id;
this.name = name;
}
private int id;
private String name;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
@Override
public boolean equals(Object obj)
{
return ((Employee)obj).getId()==(this.getId());
}
@Override
public int hashCode()
{
return Integer.valueOf(getId()).hashCode();
}
@Override
public String toString()
{
return this.id + "--" + this.name;
}
}
}
我不明白对象e2
如何能够覆盖对象e
中的密钥,而不是值。根据我的理解,输出应该是:
{1 - e2 = e2,2 - e1 = e1}
答案 0 :(得分:2)
实际上,你倒退了。该值被覆盖。密钥没有被替换,因为就HashMap
而言,e和e2是相同的。
您的输出为{1--e=e2, 2--e1=e1}
:
key = e, value = "e2" (which overrode the old value "e")
key = e1, value = "e1"
答案 1 :(得分:2)
答案 2 :(得分:0)
当java.util.HashMap实现等于put()调用中提供的密钥时,它不会替换现有密钥。所以,你的第三个put()检查地图的现有内容,找到一个现有的相等键并只更新相关的值。
这说明了为什么equals()和hashCode()通常应考虑所有属性,因为被认为相等的对象被许多util类视为可互换。
答案 3 :(得分:0)
输出{1 - e = e2,2 - e1 = e1}背后的原因是:
当现有地图中存在匹配(基于密钥)时,地图不会替换密钥,只会替换它。 所以适用于这种情况:
这里e等于Map的e2。当Map搜索位置时放入m.put(e2,“e2”);它到达e - “e1”所在的位置并用“e2”替换“e1”并离开键,即在这种情况下完整