В HashMap можно потерять элемент, т.е. создать такие условия при которых получить элемент невозможно. Суть в том что ключом будет объект с переопределенными equals и hashCode. Далее, hashCode будет зависеть от состояния объекта (грубо говоря, от набора значений его полей). Если что то поместить в мапу с данным объектом в качестве ключа, а потом изменить состояние ключа, то значение может быть утеряно, например, при попытке достать объект по тому же ключу вернется то что было помещено в мапу ранее с таким же ключом.
Map map = new HashMap();
Test t1 = new Test();
t1.setI(1);
t1.setJ(2);
map.put(t1, "t1");
Test t2 = new Test();
t2.setI(3);
t2.setJ(4);
map.put(t2, "t2");
Test t3 = new Test();
t3.setI(5);
t3.setJ(6);
map.put(t3, "t3");
System.out.println(map); // {Test{i=5, j=6}=t3, Test{i=3, j=4}=t2, Test{i=1, j=2}=t1}
t1.setI(3);
t1.setJ(4);
System.out.println(map); // {Test{i=5, j=6}=t3, Test{i=3, j=4}=t2, Test{i=3, j=4}=t1}
System.out.println(map.get(t1)); // t2
map.put(t1, "t12");
System.out.println(map); // {Test{i=5, j=6}=t3, Test{i=3, j=4}=t12, Test{i=3, j=4}=t1}
System.out.println(map.get(t1)); // t12
Вывод: ключом должен быть immutable объект |