Обложка канала

Java Developer

Канал Java-разработчика о жизни в мире АйТи

Java Developer

4 года назад
Открыть в
Ответ: "test" Способ вычисления хэша map, set, list - это часть контракта соответствующих интерфейсов. Каждая реализация должна использовать формулу, указанную в контракте. Поэтому поведение будет общим для всех JDK. Посмотрим теперь, какой же контракт и конкретные формулы для подсчета хеша у мапы. "The hash code of a map is defined to be the sum of the hash codes of each entry in the map's entrySet() view." Посмотрим, как вычисляется хешкод у Map.Entry: "The hash code of a map entry e is defined to be: (e.getKey()==null ? 0 : e.getKey().hashCode()) ^ (e.getValue()==null ? 0 : e.getValue().hashCode())" Зная это, мы можем посчитать хешкод нашей мапы: он будет равен 0. Почему? Так как у единственной Map.Entry совпадают значения ключа и значения, то их хешкоды будут совпадать, а значит хешкод Map.Entry будет равен 0 (XOR двух одинаковых чисел дает всегда 0). После добавления второго Map.Entry хешкод останется равным 0, так как там тоже совпадают значения ключа и значения. Повезло, повезло. В итоге при вызове метод get будет искать Map.Entry в нужном бакете и, встретив нужную ноду, вызовет equals, который вернет true, так как при вставке значение ключа не копируется, и он будет отображать все изменения, которые с ним происходили. Естественно, изменять ключ после вставки в HashMap крайне не рекомендуется, иначе потом можно его не найти. Но в данном конкретном случае нам повезло, что хешкод не изменился.