Моего концептуальное понимания java.util.HashMap выглядит следующим образом:Почему java.util.HashMap использовать связанный список внутри
Ее основной актив по сравнению с другими реализациями Карты является постоянным время поиска, предполагая, что не являются столкновениями. По этой причине базовая реализация использует массив фиксированной длины - единственную структуру данных в информатике, которая имеет O (1) поиск.
Массив фиксированной длины, используемый для хранения записей карты, инициализируется заданным размером при создании и расширении (по расширению, я имею в виду, что создается больший массив и значения, скопированные поперек), когда размер карты приближается к длина массива с фиксированной длиной.
Когда значение помещается в карту, пара значений ключа помещается во внутреннюю связанную реализацию списка для данного ключа. Когда есть столкновение, последующие пары значений ключа добавляются к списку.
При получении с карты hashCode() ключа используется для получения индекса массива реализации внутреннего связанного списка, и вы либо имеете свое значение, если список имеет размер 1, либо вы перебираете по списку вызывая equals() по ключу каждого элемента, пока не найдете свои значения.
Основанный на точке 2, HashMap должен расширять массив, операция, которая, несомненно, линейна. Почему он использует реализацию внутреннего связанного списка (O (n) поиск) для разрешения конфликтов? Почему он не использует структуру данных с поиском O (log n), как двоичное или красное черное дерево, для повышения производительности?
Потому что каждый ожидает, что каждое ведро содержит не более нескольких записей. –
Потому что вы надеетесь получить только очень мало столкновений в первую очередь. Для всего лишь нескольких элементов линейный поиск не является существенным. – 5gon12eder
Если я правильно помню, Java 8 * * возвращается к дереву двоичного поиска, если количество столкновений в одном ковше превышает некоторый порог. –