Java HashMap返回值与我对equals和hashcode的理解不符
以下代码示例的输出为: {1-e=e2,2-e1=e1} 我不理解对象e2如何能够覆盖对象e中的键,而不是值。据我所知,结果应该是: {1-e2=e2,2-e1=e1}Java HashMap返回值与我对equals和hashcode的理解不符,java,hashmap,equals,hashcode,Java,Hashmap,Equals,Hashcode,以下代码示例的输出为: {1-e=e2,2-e1=e1} 我不理解对象e2如何能够覆盖对象e中的键,而不是值。据我所知,结果应该是: {1-e2=e2,2-e1=e1} 事实上,你倒过来了。该值已被覆盖。密钥没有被替换,因为就HashMap而言,e和e2是相同的 您的输出是{1-e=e2,2-e1=e1}: 事实上,你倒过来了。该值已被覆盖。密钥没有被替换,因为就HashMap而言,e和e2是相同的 您的输出是{1-e=e2,2-e1=e1}: put方法的HashMap状态为: 将指定的值与此
事实上,你倒过来了。该值已被覆盖。密钥没有被替换,因为就HashMap而言,e和e2是相同的 您的输出是{1-e=e2,2-e1=e1}:
事实上,你倒过来了。该值已被覆盖。密钥没有被替换,因为就HashMap而言,e和e2是相同的 您的输出是{1-e=e2,2-e1=e1}: put方法的HashMap状态为: 将指定的值与此映射中的指定键相关联。如果映射以前包含键的映射,则替换旧值 因此,不会覆盖键,只覆盖值。对于put方法的HashMap状态: 将指定的值与此映射中的指定键相关联。如果映射以前包含键的映射,则替换旧值
因此,不会覆盖键,只覆盖值。java.util.HashMap实现不会替换与put调用中提供的键相同的现有键。因此,您的第三个put检查映射的现有内容,找到现有的equal键,并只更新关联的值
这说明了为什么equals和hashCode通常应该考虑所有属性,因为许多util类认为相等的对象是可互换的。java.util.HashMap实现在与put调用中提供的键相等时不会替换现有键。因此,您的第三个put检查映射的现有内容,找到现有的equal键,并只更新关联的值
这说明了为什么equals和hashCode通常应该考虑所有属性,因为许多util类认为相等的对象是可互换的。输出{1-e=e2,2-e1=e1}背后的原因是: 映射不替换键它仅在现有映射中存在基于键的匹配时才替换值。 因此,在这种情况下适用:
这里e等于Map的e2。当地图搜索位置时放置m.pute2,e2;它转到存在e-e1的位置,用e2替换e1,并保留键,即在这种情况下,e保持不变输出{1-e=e2,2-e1=e1}背后的原因是: 映射不替换键它仅在现有映射中存在基于键的匹配时才替换值。 因此,在这种情况下适用:
这里e等于Map的e2。当地图搜索位置时放置m.pute2,e2;它到达存在e-e1的位置,将e1替换为e2,并保留键,即在本例中,e保持不变我认为整个对象被覆盖。但在地图的情况下,有两个对象:一个键和一个值。假定密钥的hashCode唯一标识密钥,因此覆盖它没有意义。所以只有值被覆盖。我以为整个对象都被覆盖了。但是在地图的情况下,有两个对象:一个键和一个值。假定密钥的hashCode唯一标识密钥,因此覆盖它没有意义。所以只有值被覆盖。这是有意义的,我认为整个对象都被覆盖了。这是有意义的,我认为整个对象都被覆盖了。
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;
}
}
}
key = e, value = "e2" (which overrode the old value "e")
key = e1, value = "e1"