Прежде всего: HashMap
, в частности, не обеспечивает стабильный и / или определенный порядок. Таким образом, все, что вы наблюдаете, является просто деталью реализации, и вы не должны зависеть от нее.
Поскольку иногда полезно знать причину, по-видимому, случайного порядка, вот основная идея:
A HashMap
содержит количество сегментов (реализованных в виде массива), в которых хранятся записи.
Когда элемент добавляется на карту, он присваивается сегментам на основе значения, полученного из его hashCode
и размера сегмента HashMap
. (Обратите внимание, что вполне возможно, что корзина уже занята, что называется столкновением. Это обрабатывается изящно и правильно, но я проигнорирую эту обработку для описания, потому что это не меняет концепцию).
Воспринимаемый порядок ввода (например, возвращаемый путем итерации по Map
) зависит от порядка записей в этих сегментах.
Всякий раз, когда размер перефразируется (так как карта превысила свой порог полноты), количество блоков изменяется, что означает, что позиция каждого элемента может измениться, поскольку позиция сегмента также определяется количеством блоков.