Что это значит? запись e = таблица [bucketIndex]; - PullRequest
0 голосов
/ 04 марта 2020

Я изучаю, как HashMap работает внутри и не могу понять этот метод:

void addEntry(int hash, K key, V value, int bucketIndex) {
        Entry<K,V> e = table[bucketIndex];
        table[bucketIndex] = new Entry<K,V>(hash, key, value, e);
        if (size++ >= threshold)
            resize(2 * table.length);

Почему объект e получает адрес (или что здесь происходит?) из table[bucketIndex] и затем этот table[bucketIndex] получает новый Entry(hash, key, value, <strong>e</strong>)? В чем причина, почему не просто использовать то, что ниже?

Entry<K,V> e = new Entry<K,V>(hash, key, value)
table[bucketIndex] = e;

1 Ответ

2 голосов
/ 04 марта 2020

Потому что в HashMap могут быть коллизии (то есть разные ключи, которые выдают одинаковые bucketIndex). Если они сделали то, что вы предлагаете, в случае коллизии последний вставленный элемент удалит предыдущие в случае коллизии, возможно, практически непредсказуемым образом.

Entry реализован как какой-то связанный список, поэтому он на самом деле немного неправильно назван и фактически является узлом связанного списка записей. По этой причине e передается как последний параметр конструктора Entry.

Создание нового Entry, который ссылается на предыдущий (e), и добавление его в тот же место, где e была операция вставки нового узла в начале связанного списка, и работает, даже если e было null (т.е. не было никакого столкновения вообще, а созданный Entry является первый с заданным bucketIndex).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...