Комментарии 18
Метод hashCode() класса Object возвращает ссылку на адресс в памяти объекта в целочисленной форме.
Я просто оставлю это здесь — Как работает hashCode() по умолчанию?
Как именно происходит переход?
Получается ключи в HashMap должны быть Comparable?
Само дерево начинает строится тут
А можно ссылку на оригинал? А то я что-то не нашёл.
Как мы уже
![image](https://habrastorage.org/webt/ba/mo/sr/bamosrcidxmckp1bl_cqu4cn6ug.jpeg)
Понимаю, что взято с оригинала, но там под капотом чуть сложнее все происходит в строке:
index = hashCode(key) & (n-1).
Происходит подмена понятий, правильнее писать:
i = hash(key) & (n-1)
Где в hash(key) — методе HashMap происходит дополнительная магия с key.hashCode().
Пытливые умы могут залезть в исходники HashMap и посмотреть какая именно.
В тексте есть следующее упоминание:
Bucket -ы различаются по ёмкости (свойство capacity). Отношение между bucket и capacity выглядит следующим образом:
capacity = number of buckets * load factor
В то время как в документации к HashMap пишется: "The capacity is the number of buckets in the hash table, and the initial capacity is simply the capacity at the time the hash table is created."
Возможно, имелось в виду, что:
макс. количество элементов (entries) в HashMap до перехэширования <= capacity (number of buckets) * load factor
?
Да, это на редкость странное утверждение, что бакеты различаются по ёмкости. Ёмкость это показатель относящийся ко всей HashMap.
Что касается вашего вопроса, то я всегда думал, что capacity это максимальное количество элементов во всей HashMap. То есть сумма элементов во всех бакетах.
Но, согласно документации, capacity это количество бакетов ))). То есть то же самое, что number of buckets. И формула capacity = number of buckets * load factor получается неправильная, если понимать слово capacity в том смысле, в котором оно используется в документации к HashMap
И максимальное количество элементов до перехеширования меньше либо равно capacity * load factor.
А load factor это среднее количество элементов в одном бакете. Ну или процент пустых бакетов при условии, что в заполненных по одному элементу. По умолчания там, кажется 0.75, то есть в среднем в каждом бакете должно быть меньше одного элемента
Что касается вашего вопроса, то capacity это максимальное количество
элементов во всей HashMap. То есть сумма элементов во всех бакетах.
Похоже, что документация к HashMap противоречит этому:
The capacity is the number of buckets in the hash table, ...
Тут не говорится о том, что capacity - сумма элементов во всех бакетах. Тут говорится, что capacity - это количество самих бакетов, про элементы в бакетах нет упоминаний. Вопрос только в терминах: похоже, что то, что вы называете "capacity", в документации - "number of entries".
Да, на всякий случай, цель моего первого комментария - пересмотреть формулировку о различии бакетов по ёмкости и соответственно формулу об их взаимосвязи ниже. Документация, например, здесь.
Внутренняя работа HashMap в Java