Как Java упорядочивает элементы в HashMap или HashTable?
мне было интересно, как Java заказывает элементы в Map (HashMap или Hashtable), когда они добавляются. Ключи упорядочены по хэш-коду, ссылке на память или по приоритету выделения...?
это потому, что я заметил такие же пары в Map не всегда в том же порядке
7 ответов:
java.util.HashMapнеупорядочен; вы не можете и не должны предполагать ничего сверх этого.этот класс не дает никаких гарантий относительно порядка карты; в частности, это не гарантирует, что заказ будет оставаться постоянным с течением времени.
java.util.LinkedHashMapиспользует вставки-заказа.эта реализация отличается от
HashMapв том, что он поддерживает двусвязный список, проходящий через все его записи. Этот связанный список определяет порядок итераций, который обычно является порядком, в котором ключи были вставлены в карту (порядок вставки).
java.util.TreeMap, aSortedMap, использует природный или изготовленный на заказ ключи.карта сортируется в соответствии с естественным порядком ее ключей, или по
Comparatorпредоставляется во время создания карты, в зависимости от того, какой конструктор используется.
прежде всего:
HashMapконкретно не обеспечить стабильный и / или определенный порядок. Так что вы наблюдаете-это просто деталь реализации, и вы не должен зависит от него в любом случае.поскольку иногда полезно знать причину кажущегося случайного порядка, вот основная идея:
A
HashMapимеет количество ведер (реализованных в виде массива), в которых хранятся записи.при добавлении элемента для карты он присваивается ведрам на основе значения, полученного из его
hashCodeи размер ведраHashMap. (Обратите внимание, что возможно, что ведро уже занято, что называется столкновением. Это обрабатывается изящно и правильно, но я проигнорирую эту обработку для описания, потому что это не меняет концепцию).воспринимаемый порядок целых чисел (например, возвращаемый путем итерации по
Map) зависит от порядка записей в тех ковши.всякий раз, когда размер повторно хэшируется (потому что карта превысила порог полноты), то количество ведер изменяется, что означает, что положение каждого элемента может измениться, так как положение ведра также выводится из числа ведер.
HashMapне сортирует вообще. Для карты, которая сортируется по ключевым значениям, вы должны использоватьTreeMapвместо.из JavaDocs для
TreeMap:красно-черное дерево на основе реализации интерфейс SortedMap. Этот класс гарантирует, что карта будет внутри по возрастанию порядок ключей, отсортированных в соответствии к естественному порядку для ключа класс (см. сопоставимый), или компараторов во время создания , в зависимости от того, какой конструктор используемый.
из документации
HashMap:этот класс не дает никаких гарантий относительно порядка карты; в частности, это не гарантирует, что заказ будет оставаться постоянным в течение долгого времени.
A
Mapне упорядоченную структуру данных, вы не должны полагаться на записи вHashMapнаходясь в определенном порядке. НекоторыеMapреализации, такие какLinkedHashMapиTreeMapгарантируйте определенный заказ, ноHashMapнет.если вы действительно хотите знать, что происходит внутри, просмотра исходного кода
HashMap- вы можете найти его в src.молнии который должен быть в вашем каталоге установки JDK.A
HashMapимеет ряд "ведра", в которых он хранит свои записи. В каком ведре хранится запись, определяется хэш-кодом ключа записи. Порядок, в котором вы видите записи вHashMapзависит от хэш-кодами ключей. Но не пишите программы, которые полагаются на записи, находящиеся в определенном порядке вHashMap- реализация может измениться в будущей версии Java, и ваша программа больше не будет работать.
в хэш-таблице нет определенного порядка. Ключи помещаются в слот, основанный на хэш-коде, но даже это не тривиальный порядок по хэш-коду.
HashMap сохраняет значения, используя уникальное хэш-значение, созданное с помощью части ключа. Это хэш-значение сопоставляется с адресом, где оно будет храниться. Вот как он обеспечивает доступ O (1).
LinkedHashmap с другой стороны сохраняет порядок, в котором вы добавили к карте.
Comments