два объекта равны, это означает, что они имеют одинаковый хэш-код, но не наоборот
Обновление Java 8 в HashMap-
вы делаете эту операцию в своем коде -
myHashmap.put("old","key-value-pair");
myHashMap.put("very-old","old-key-value-pair");
Итак, предположим, что ваш хэш-код, возвращенный для обоих ключей "old"
и "very-old"
, одинаков. Тогда что будет.
myHashMap
- это HashMap, и предположим, что изначально вы не указали его емкость. Таким образом, емкость по умолчанию для java равна 16. Итак, теперь, когда вы инициализировали hashmap с помощью нового ключевого слова, он создал 16 блоков. теперь, когда вы выполнили первое заявление-
myHashmap.put("old","key-value-pair");
тогда вычисляется хеш-код для "old"
, и поскольку хеш-код тоже может быть очень большим целым числом, так, внутренне Java это сделал - (хеш-код здесь - хеш-код, а >>> - сдвиг вправо)
hash XOR hash >>> 16
, поэтому для увеличения изображения он вернет некоторый индекс, который будет находиться в диапазоне от 0 до 15. Теперь ваша пара значений ключа "old"
и "key-value-pair"
будет преобразована в переменную экземпляра ключа и значения объекта Entry. и тогда этот объект записи будет сохранен в корзине, или вы можете сказать, что при определенном индексе этот объект записи будет сохранен.
FYI- Entry - это класс в интерфейсе Map - Map.Entry, с этими сигнатурами / определениями
class Entry{
final Key k;
value v;
final int hash;
Entry next;
}
теперь при выполнении следующего оператора -
myHashmap.put("very-old","old-key-value-pair");
и "very-old"
дают тот же хеш-код, что и "old"
, поэтому эта новая пара значений ключа снова отправляется в тот же индекс или в тот же сегмент. Но поскольку этот сегмент не пустой, переменная next
объекта Entry используется для хранения этой новой пары ключ-значение.
, и он будет сохранен в виде связанного списка для каждого объекта, имеющего тот же хеш-код, но TRIEFY_THRESHOLD задается со значением 6. поэтому после достижения этого связанный список преобразуется в сбалансированное дерево (красно-черное дерево) с первым элемент как корень.