«Структура данных HashMap», которую легко запомнить.

1. Массив + связанный список + красно-черное дерево.

массив jkd1.8 + связанный список + красно-черное дерево

2. Для решения хеш-конфликтов и повышения эффективности поиска.

HashMap — это реализация хеш-таблицы (Hash Table) в среде сбора данных Java. Он использует структуру данных массива и связанного списка (или красно-черного дерева) для хранения пар ключ-значение.

Причина, по которой HashMap использует конструкцию массива + связанного списка + красно-черного дерева, заключается в решении двух проблем: конфликта хэшей и эффективности поиска .

Хэш-конфликт означает, что разные ключи могут быть сопоставлены с одной и той же позицией в хеш-таблице. Если вы просто используете массив для хранения пар ключ-значение, произойдет конфликт ключей. Чтобы решить эту проблему, HashMap использует механизм хеш-таблицы для хранения связанного списка или красно-черного дерева в каждой позиции массива и хранения пар ключ-значение с одинаковым значением хеш-функции в одном связанном списке или красно-черном списке. дерево. При возникновении конфликта хэшей вам нужно только выполнить поиск в связанном списке или красно-черном дереве в соответствующем месте.

Эффективность поиска означает необходимость минимизировать количество ненужных поисков при поиске пары ключ-значение в хеш-таблице. Поскольку хеш-таблица хранится в соответствии с хеш-значением, эффективность поиска можно повысить за счет оптимизации хеш-функции, увеличения количества сегментов, использования связанных списков или красно-черных деревьев и т. д. В HashMap, когда длина связанного списка превышает 8 узлов, связанный список автоматически преобразуется в красно-черное дерево, что может еще больше повысить эффективность поиска.

Подводя итог, можно сказать, что причина, по которой HashMap использует конструкцию массива + связанного списка + красно-черного дерева, заключается в решении двух проблем: конфликта хэшей и эффективности поиска, чтобы HashMap обладал высокой производительностью и масштабируемостью в практических приложениях.

3. Преобразовать связанный список в красно-черное дерево: массив превышаетTREEIFY_THRESHOLD默认8 并且 链表大于等于MIN_TREEIFY_CAPACITY默认64。红黑树转链表:数组少于UNTREEIFY_THRESHOLD默认6。

В Java 8 реализация HashMap использует TREEIFY_THRESHOLDпараметр , который представляет собой порог преобразования связанного списка в красно-черное дерево. Когда количество элементов в сегменте достигнет этого порога, связанный список в сегменте будет преобразован в красно-черное дерево, чтобы повысить производительность таких операций, как поиск, вставка и удаление. По умолчанию TREEIFY_THRESHOLDзначение равно 8.

Кроме того, в Java 8 представлен новый параметр MIN_TREEIFY_CAPACITY, который представляет минимальную емкость, необходимую для запуска преобразования связанного списка в красно-черное дерево. Когда емкость HashMap (то есть размер массива) меньше этого значения, операция преобразования связанного списка в красно-черное дерево не будет запущена. По умолчанию MIN_TREEIFY_CAPACITYзначение равно 64.

Следовательно, когда количество элементов в сегменте превышает TREEIFY_THRESHOLD(по умолчанию 8) и емкость HashMap (размер массива) больше или равна MIN_TREEIFY_CAPACITY(по умолчанию 64), связанный список будет преобразован в красно-черное дерево для улучшить поиск, вставку и удаление, производительность других операций.

Короче говоря, в Java 8, когда количество элементов в сегменте в HashMap превышает TREEIFY_THRESHOLDи размер массива больше или равен size MIN_TREEIFY_CAPACITY, связанный список преобразуется в красно-черное дерево.

В Java 8 реализация HashMap использует UNTREEIFY_THRESHOLDмеханизм под названием , который представляет порог для преобразования красно-черного дерева в связанный список. Когда количество элементов в корзине меньше этого порога, красно-черное дерево в корзине преобразуется в связанный список для уменьшения потребления памяти. По умолчанию UNTREEIFY_THRESHOLDзначение равно 6.

В частности, при удалении элементов из корзины, если количество элементов в корзине меньше UNTREEIFY_THRESHOLD(по умолчанию — 6), а корзина изначально имела красно-черную древовидную структуру, то все элементы в корзине будут перестроены. в виде структуры связанного списка для уменьшения использования памяти.

Следует отметить, что данная операция используется только в операции удаления, то есть только тогда, когда выполняется операция удаления и красно-черное дерево используется для хранения в текущем сегменте, оно будет преобразовано в связанный список, в противном случае он не будет конвертирован.

Короче говоря, когда количество элементов в корзине в HashMap меньше UNTREEIFY_THRESHOLD(по умолчанию 6), а корзина ранее сохранялась с использованием красно-черного дерева, при выполнении операции удаления все элементы в корзине будут преобразован в структуру связанного списка для уменьшения потребления памяти.

4. Красно-черное дерево представляет собой самобалансирующееся двоичное дерево поиска (BST). . .

Причина, по которой HashMap использует красно-черные деревья, заключается в том, что красно-черные деревья могут обеспечить лучшую производительность и баланс. Красно-черное дерево представляет собой самобалансирующееся двоичное дерево поиска (BST) со следующими характеристиками:

  1. Каждый узел черный или красный, а корневой узел черный.
  2. Если узел красный, его дочерние элементы должны быть черными.
  3. Каждый листовой узел (NIL-узел) представляет собой черный пустой узел.
  4. Путь от любого узла к каждому из его конечных узлов содержит одинаковое количество черных узлов.
  5. Красно-черное дерево — это приблизительно сбалансированное двоичное дерево поиска, которое может гарантировать, что временная сложность основных динамических операций в худшем случае составит O(log n).

По сравнению с обычными двоичными деревьями поиска и сбалансированными деревьями красно-черные деревья могут поддерживать баланс дерева при вставке и удалении элементов, тем самым избегая вырождения в связанный список и гарантируя, что временная сложность основных динамических операций всегда равна O(log n ). Кроме того, по сравнению с другими структурами данных, такими как деревья AVL, стоимость обслуживания красно-черных деревьев ниже, поскольку существует только два типа вращения красно-черных деревьев, тогда как существует четыре типа вращения деревьев AVL, поэтому это легче реализовать.

В реализации HashMap, поскольку размер массива фиксирован и может быть небольшим, для элементов в каждом сегменте использование красно-черного дерева может повысить эффективность поиска и вставки, гарантируя при этом, что временная сложность в крайних случаях по-прежнему будет O(log n) — хорошее сбалансированное решение.

Supongo que te gusta

Origin blog.csdn.net/samsung_samsung/article/details/130870985
Recomendado
Clasificación