Результат следующего примера кода:
{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}
Собственно, ты получил это назад. Значение было переопределено. Ключ не был заменен, так как, насколько это касается HashMap
, e и e2 идентичны.
Ваш результат равен {1--e=e2, 2--e1=e1}
:
key = e, value = "e2" (which overrode the old value "e")
key = e1, value = "e1"
Состояние Javadocs для HashMap для метода put
:
Связывает указанное значение с указанным ключом на этой карте. Если ранее карта содержала отображение для ключа, старое значение заменяется.
Следовательно, ключ не перезаписывается, а только значение.
Причиной выхода {1 - e = e2, 2 - e1 = e1} является:
Карта не заменяет ключ, он делает это только для значения, когда есть совпадение (присутствует на основе ключа) в существующей карте. Таким образом, применяется в этом случае:
Здесь e равно e2 для Map. Когда Map ищет местоположение для размещения m.put(e2, "e2"); он переходит в место, где присутствует e-- "e1" и заменяет "e1" на "e2" и оставляет ключ, т.е. e в этом случае неповрежденным
Реализация java.util.HashMap не заменяет существующий ключ, когда он равен ключу, указанному в вызове put(). Итак, ваш третий put() проверяет существующее содержимое карты, находит существующий равный ключ и просто обновляет связанное значение.
Это иллюстрирует, почему equals() и hashCode() обычно должны учитывать все свойства, поскольку объекты, которые считаются равными, считаются взаимозаменяемыми многими классами util.