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

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

Похожие вопросы