Возвращаемое значение Java HashMap не соответствует моему пониманию equals и hashcode

1

Результат следующего примера кода:

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

Я не понимаю, как Object e2 смог перезаписать ключ в Object e, но не значение. По моему мнению, выход должен был быть:

{1 - e2 = e2, 2 - e1 = e1}

Теги:
equals
hashcode
hashmap

4 ответа

2
Лучший ответ

Собственно, ты получил это назад. Значение было переопределено. Ключ не был заменен, так как, насколько это касается HashMap, e и e2 идентичны.

Ваш результат равен {1--e=e2, 2--e1=e1}:

key = e, value = "e2" (which overrode the old value "e")
key = e1, value = "e1" 
  • 0
    Это имеет смысл, я думал, что весь объект перезаписан.
2

Состояние Javadocs для HashMap для метода put:

Связывает указанное значение с указанным ключом на этой карте. Если ранее карта содержала отображение для ключа, старое значение заменяется.

Следовательно, ключ не перезаписывается, а только значение.

  • 0
    Я думал, что весь объект перезаписан.
  • 0
    Но в случае с картами есть два объекта: один ключ и одно значение. Предполагается, что хэш-код ключа однозначно идентифицирует ключ, поэтому нет смысла перезаписывать его. Таким образом, только значение перезаписывается.
Показать ещё 1 комментарий
0

Причиной выхода {1 - e = e2, 2 - e1 = e1} является:

Карта не заменяет ключ, он делает это только для значения, когда есть совпадение (присутствует на основе ключа) в существующей карте. Таким образом, применяется в этом случае:

Здесь e равно e2 для Map. Когда Map ищет местоположение для размещения m.put(e2, "e2"); он переходит в место, где присутствует e-- "e1" и заменяет "e1" на "e2" и оставляет ключ, т.е. e в этом случае неповрежденным

0

Реализация java.util.HashMap не заменяет существующий ключ, когда он равен ключу, указанному в вызове put(). Итак, ваш третий put() проверяет существующее содержимое карты, находит существующий равный ключ и просто обновляет связанное значение.

Это иллюстрирует, почему equals() и hashCode() обычно должны учитывать все свойства, поскольку объекты, которые считаются равными, считаются взаимозаменяемыми многими классами util.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню