Всем привет, разбираюсь с HashMap, почитал несколько статей, глянул исходники... мало чего понял, но что то да понял ) В общем вот такой ответ не смог для себя найти:
При добавлении новой пары ключ/значение, создаётся новый экземпляр класса Node, высчтывается хеш по ключу на основе которого определяется ячейка в массиве table (корзина), куда уже связным списком падают все объекты класса Node содержащего нашу пару ключ/значение которые мы добавляем с одинковым хешем. Если хеш другой, то другая ячейка (корзина).
Но в примере был скриншот, где в таблице всего 16 ячеек. Я так понял это минимальный размер по умолчанию. Внимание вопрос, что будет если в table будет добавлено 17 элементов Node с разными хешами? Таблица пересоздастся и создастся более большая? Я знаю ответ есть в исходном коде класса, но я ещё не настолько хорош, чтоб полностью его разобрать. Потому прошу словами попроще рассказать.
Мне единственное в глаза бросилось поле:
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
наверное это и есть тот самый раз минимальный размер table, и тогда есть вот такое ещё поле:
static final int MAXIMUM_CAPACITY = 1 << 30;
я правда не знаю что такое 1 << 30, предполагаю что эквивалент 30*30, но это не точно )
Lyokha Blagodatskikh
48 уровень
Устройство HashMap
Комментарии (3)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Младший помощник вспомогательного заместителя курьера
15 ноября 2022, 04:55
Номер корзины это не хэшкод, номер корзины куда пихаем объект высчитывается функцией хэш, которая под капотом у хэшмапы, можно провалится в код и посмотреть
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
+1
КириллExpert
14 ноября 2022, 22:38
ты не сможешь создать мапу в 17 элементов DEFAULT_INITIAL_CAPACITY 1 << 4; // aka 16
в классе указано, значение должно быть степенью двойки, таким образом при попытке создать хешмап размером 17 бакетов будет создана мапа размером в 32.
+1
Влад Java Developer в Tinkoff
6 ноября 2022, 16:27
https://habr.com/ru/post/421179/
+1