繁体   English   中英

Java HashMap返回值未根据我对equals和hashcode的理解进行确认

[英]Java HashMap return value not confirming with my understanding of equals and hashcode

以下代码示例的输出是:

{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}

实际上,您将其倒退了。 该值被覆盖。 密钥没有被替换,因为就HashMap而言,e和e2是相同的。

您的输出为{1--e=e2, 2--e1=e1}

key = e, value = "e2" (which overrode the old value "e")
key = e1, value = "e1" 

HashMap的Javadocs状态为put方法:

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

因此,密钥不会被覆盖,只会覆盖值。

当java.util.HashMap实现等于put()调用中提供的键时,它不会替换现有键。 因此,您的第三个put()检查地图的现有内容,找到一个现有的相等键,然后更新关联的值。

这说明了为什么equals()和hashCode()通常应考虑所有属性,因为许多util类认为被认为相等的对象是可互换的。

输出{1 --- e = e2,2--e1 = e1}的原因是:

Map不会替换键,而是仅在现有Map中存在匹配项(基于键)时才对值进行替换。 因此适用于这种情况:

这里e等于Map的e2。 当地图搜索位置时放置m.put(e2,“ e2”); 它转到存在e-“ e1”的位置,并用“ e2”替换“ e1”并保留密钥,即e在这种情况下保持不变

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM