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

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

Войти через центр авторизации
Похожие вопросы
Bell Integrator Хабаровск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽
Bell Integrator Ульяновск
До 400 000 ₽
07 мая 2024, в 18:23
20000 руб./за проект
07 мая 2024, в 18:09
2000 руб./за проект
07 мая 2024, в 17:40
300 руб./за проект