Задать вопрос
@sulik93
Начал изучать Java. Продолжаю изучать Java.

Как добавляются элемент в HashMap?

Всем привет!

Начал углубленно изучать Collections в Java.
Остновился на HashMap. Нашел статью на habr-e.

Начал проверять с исходниками. У меня Java 8.
Понятно как вычисляется хеш:
static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }


Но как мы получаем позицию для вставки в таблицу и где эта таблица не понятно?
Это код вставки элемента:
final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
                   boolean evict) {
        Node<K,V>[] tab; Node<K,V> p; int n, i;
        if ((tab = table) == null || (n = tab.length) == 0)
            n = (tab = resize()).length;
        if ((p = tab[i = (n - 1) & hash]) == null)
            tab[i] = newNode(hash, key, value, null);
        else {
            Node<K,V> e; K k;
            if (p.hash == hash &&
                ((k = p.key) == key || (key != null && key.equals(k))))
                e = p;
            else if (p instanceof TreeNode)
                e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);
            else {
                for (int binCount = 0; ; ++binCount) {
                    if ((e = p.next) == null) {
                        p.next = newNode(hash, key, value, null);
                        if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
                            treeifyBin(tab, hash);
                        break;
                    }
                    if (e.hash == hash &&
                        ((k = e.key) == key || (key != null && key.equals(k))))
                        break;
                    p = e;
                }
            }
            if (e != null) { // existing mapping for key
                V oldValue = e.value;
                if (!onlyIfAbsent || oldValue == null)
                    e.value = value;
                afterNodeAccess(e);
                return oldValue;
            }
        }
        ++modCount;
        if (++size > threshold)
            resize();
        afterNodeInsertion(evict);
        return null;
    }

Я полагаю, что в новой версии изменили HashMap.
Что такое TreeNode?
Как это все работает?
Этот момент отличается от написанного в статье.
  • Вопрос задан
  • 1213 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
Я так подозреваю (беглый взгляд, перед сном), что они модернизировали метод разрешения коллизий. Раньше там были списки, теперь некое дерево поиска. Покопайте исходя из этого посыла. Надо убеждаться, конечно.
Ответ написан
Комментировать
TheKnight
@TheKnight
Программист
https://examples.javacodegeeks.com/core-java/util/...
Может быть эта статья вам поможет?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
Сбер Москва
от 300 000 до 350 000 ₽
DIGITAL SECTOR Краснодар
от 250 000 до 450 000 ₽
Сбер Санкт-Петербург
До 350 000 ₽