Java HashMap返回值与我对equals和hashcode的理解不符

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状态为: 将指定的值与此

以下代码示例的输出为:

{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状态为:

将指定的值与此映射中的指定键相关联。如果映射以前包含键的映射,则替换旧值

因此,不会覆盖键,只覆盖值。

对于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"