Почему HashMap не гарантирует, что порядок карты останется постоянным с течением времени

Я читал о разнице между Hashmap и Hashtable здесь: http://javarevisited.blogspot.sg/2010/10/difference-between-hashmap-and.html

кто-нибудь может пролить свет на то, почему он говорит следующее?

"5. HashMap не гарантирует, что порядок карты останется постоянным с течением времени."

может ли порядок измениться во время повторного хеширования, вот почему?

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

AFIK, ArrayList дает такую гарантию (дайте мне знать, если я ошибаюсь)

EDIT:' Order of map ' = возможно, порядок ввода ключей или значений.

4 ответов


A HashMap не имеет никакого порядка-в любое время. На самом деле он не используется для этой цели. Приказ мая изменить, даже если не ворошить.

Если вам нужно, чтобы порядок оставался постоянным, используйте LinkedHashMap


суть стратегии хэширования состоит в том, чтобы размещать объекты псевдослучайным образом. Он делает это так, что большую часть времени, только один ключ/элемент будет хешированный для данного сегмента. Это позволяет O (1) время поиска. Когда HashMap или Hashtable растет, количество ведер изменяется, а ключи / элементы размещаются другим псевдослучайным образом.

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

кстати, если вас интересует, сколько заказов может иметь небольшое количество ключей порядок элементов в хэш-коллекции


для меня следующий код:

Map <Integer, Object> map = new HashMap <Integer, Object> (4);

map.put (60, null);
map.put (48, null);
map.put (29, null);

System.out.println (map);

map.put (47, null);
map.put (15, null);
map.put (53, null);

map.remove (47);
map.remove (15);
map.remove (53);

System.out.println (map);

выходы:

{29=null, 48=null, 60=null}
{48=null, 29=null, 60=null}

порядок изменился из-за повторного хэширования, которое происходит при превышении начальной емкости (здесь, 4). Несмотря на то, что дополнительные записи удаляются снова, исходный порядок не восстанавливается.


HashMap имеет количество ведер (реализованных в виде массива), в которых хранятся записи.

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

почему HashMap не гарантирует, что порядок карты останется постоянным с течением времени