Что означает количество ведер в HashMap?

Я читал о Хашмапе.

У экземпляра HashMap есть два параметра, которые влияют на его производительность: начальная емкость и коэффициент загрузки. Емкость - это количество ведер в хеш-таблице.

Если в Hashmap имеется 10 пар значений ключа. Предположим, что Hashcode отличается.

Каждый из них будет находиться в одном ведре? Или один ковш может иметь пару пар с несколькими ключами?

Так как bucket по-английски означает большую вещь, в которой могут находиться многие объекты.

Ответ 1

Да, точно, каждое ведро может иметь несколько пар ключ-значение.

Объект hashCode() определяет, в каком ведре он входит, через это выражение: object.hashCode() % n, где n = общее количество ведер и % - оператор модуля.

Чаще всего объекты будут хорошо распределены между ведрами, но у вас нет гарантии, куда они идут. Это зависит от данных и функции hashCode.

Очевидно, что когда реализация hashCode плохая, производительность хэш-карты будет снижаться.

Также ознакомьтесь с контрактом equals/hashcode, который имеет значение.

Ответ 2

В java, если вы храните объект в HashMap, первая реализация HashMap вызывает метод hashCode(), чтобы найти местоположение ведра. Затем он сохраняет оба: ключ и значение как запись. NB! он сохраняет ключ также потому, что он имеет решающее значение при извлечении объекта. Два объекта могут иметь один и тот же хэш-код, поэтому, если это произойдет, тогда HashMap будет использовать одно и то же место в ковше и сохранить там второй объект. Внутри для этого используется LinkedList. (не java.util.LinkedList, но более простая реализация)

Во время извлечения: у вас есть ключ → hashCode() → расположение корзины → поиск в LinkedList по ключу → возвращающий объект.

EDIT: Таким образом, у вас есть один ковш в одном месте, но ведро - LinkedList, поэтому он может хранить несколько записей. Таким образом, количество ведер - это емкость Hashmap и описывает, сколько записей вы можете сохранить, не связывая их в списке.

Вы можете найти замечательную статью и более подробное объяснение здесь: http://javahungry.blogspot.com/2013/08/hashing-how-hash-map-works-in-java-or.html http://javarevisited.blogspot.com/2011/02/how-hashmap-works-in-java.html

Ответ 3

Bucket with hashcode 1    Bucket with hashcode 2 and similar
  K and V                    K and V
  K and V                    K and V 

Итак, клавиша hashCode() ключа решает, в каком ведре идет пара K V, и тот же hashCode используется для поиска пары K V при поиске.

hashCode() никогда не должен возвращать постоянное значение. Поскольку это будет означать, что все объекты будут находиться в одном ведре. И это было бы так же, как если бы не использовать Map. Поскольку все пары ключевых значений будут в одном и том же ведре, Java придется перебирать все объекты, чтобы найти ключ.