Java 8 Hashmap Internals - PullRequest
       8

Java 8 Hashmap Internals

0 голосов
/ 15 ноября 2018

Я прошел реализацию Java 8 Hashmap и пришел с сомнениями ниже. Пожалуйста, помогите мне уточнить их:

  1. Я прочитал в статье, в которой говорится, что узлы с одинаковым хеш-кодом будет добавлен в тот же сегмент, что и связанный список. Это говорит о том, что новый узел к этому связанному списку будет добавлен в заголовок вместо хвоста, чтобы избежать обхода хвоста. Но когда я вижу исходный код, новый узел добавляется в хвост. Это правильно?
  2. Я не совсем понял эту переменную MIN_TREEIFY_CAPACITY. Это похоже на то, что после такого большого количества вся карта будет преобразована в дерево (из массива в дерево)?

1 Ответ

0 голосов
/ 15 ноября 2018

Но когда я вижу исходный код, новый узел добавляется в хвост.Это правильно?

Добавляется в голову, в более старых версиях.Однако в Java 8 было сделано много изменений.

class A {
    static class SameHash {
        final int n;

        SameHash(int n) {
            this.n = n;
        }

        @Override
        public int hashCode() {
            return 1;
        }

        @Override
        public String toString() {
            return "SameHash{" +
                    "n=" + n +
                    '}';
        }
    }

    public static void main(String[] args) {
        HashSet<SameHash> set = new HashSet<>();
        for (int i = 1; i <= 4; i++)
            set.add(new SameHash(i));
        System.out.println(set);
    }
}

печатает

[SameHash{n=1}, SameHash{n=2}, SameHash{n=3}, SameHash{n=4}]

ПРИМЕЧАНИЕ. Ключи могут иметь разные хэш-коды, но могут оказаться в одном и том же сегменте.

Я не полностью понял эту переменную MIN_TREEIFY_CAPACITY.Похоже ли это после такого большого количества, вся карта будет преобразована в дерево (из массива в дерево)?

После этого подсчета ведро преобразуется в дерево, если ключ равен Comparable

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