java - 理解Hashmap put方法

标签 java

我正在尝试了解 HashMap put 行为,但我对下面的场景有点困惑。下面是我将在 HashMap 中用作键的类之一的实现

class Person {
    int id;
    String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Person [id=" + id + ", name=" + name + "]";
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + id;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Person other = (Person) obj;
        if (id != other.id)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }

}

出于测试目的,我有一个 util 方法

public  void displayMap() {
        Person person = new Person();
        person.setId(1);
        person.setName("praveen");
        Map<Person, String> mapPerson = new HashMap<>();
        mapPerson.put(person, "");
        person.setId(2);
        person.setName("praveen");
        mapPerson.put(person, "");
        System.out.println(mapPerson);
    }

我预计输出为{Person [id=1, name=praveen]=, Person [id=2, name=praveen]=}但我将其视为 {Person [id=2, name=praveen]=, Person [id=2, name=praveen]=} .

我使用同一个 person 对象作为键插入多次,但具有不同的 id 值。但据我了解,如果 key 相同,理想情况下应该用新 key 替换现有 key 。但我看到的是 Id=2 且 name=praveen 的人多次显示。这不是重复key并且违反了具有重复key的hashmap原则吗?为什么显示{Person [id=2, name=praveen]=, Person [id=2, name=praveen]=}不是{Person [id=1, name=praveen]=, Person [id=2, name=praveen]=}

最佳答案

来自 map Javadoc:

Note: great care must be exercised if mutable objects are used as map keys. The behavior of a map is not specified if the value of an object is changed in a manner that affects equals comparisons while the object is a key in the map.

该指令的摘要:永远,永远修改您刚刚作为 map 键放入的内容,糟糕的事情将会发生,并且没有办法告诉会发生什么糟糕的事情。

您修改了作为 map 键放入的内容,基本上就发生了不好的事情。

您应该为第二次插入启动一个 Person 对象,然后事情就会正常正确地发生。

关于java - 理解Hashmap put方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44687923/

相关文章:

java - 没有响应类型的Spring Boot RestTemplate发布

java - 遇到 OutOfMemoryException 时删除 List<> 的一部分

java - 如何直接声明并将值分配给 hashMap

java - 如何根据我当前的位置使指南针指向我特定的经纬度位置?

java - 每个 Action 监听器的单独类(class)?

java - 从方法中获取实例

java - 维基百科解析器

java - 如何在ejb中依次运行两个用@Schedule注解的方法

java - 使用信号量实现监听

java - Node.js Hmac SHA256 base64 的字符串