HashMap не дает никаких гарантий относительно своего порядка итераций.В принципе возможно (то есть, это разрешено спецификацией) для порядка, в котором ключи, например, меняются от одной итерации к другой, даже если содержимое карты не изменилось, или для порядка итерацииключи отличаются от порядка итераций соответствующих значений.
Это указано в спецификации HashMap :
Этот класс не дает никаких гарантий относительно порядкакарты;в частности, это не гарантирует, что порядок останется постоянным во времени.
На практике порядок итераций HashMap стабилен от одной итерации к следующей, и дажеот одного вызова JVM к другому, если HashMap инициализируется и заполняется точно так же.Однако для приложения неразумно полагаться на это.Создание HashMap с другим начальным размером или коэффициентом загрузки может повлиять на порядок итераций, даже если карта заполнена тем же содержимым.Реализация HashMap время от времени меняется, и это также влияет на порядок итераций.Такие изменения происходят даже в выпусках исправлений или исправлений JDK.К сожалению, история показала, что приложения ломаются при изменении порядка итераций.Поэтому надежные приложения должны стремиться избегать каких-либо зависимостей от порядка итерации HashMap.
Это довольно сложно сделать на практике.Мне известна одна (не публичная) версия JDK, в которой есть режим тестирования, который рандомизирует порядок итераций HashMaps.Это потенциально помогает избавиться от таких зависимостей.
Если вам нужно сопоставить ключи и значения HashMap во время его итерации, получите entrySet () HashMap и повторите это.Он предоставляет записи карты (пары ключ-значение), поэтому связь между ключами и значениями сохраняется.
Альтернативные реализации Map в JDK обеспечивают четко определенный порядок итераций.TreeMap и ConcurrentSkipListMap упорядочивают свои записи на основе предоставленного метода сравнения.LinkedHashMap обеспечивает порядок итераций, основанный на порядке вставки.(Он также предоставляет режим, в котором итерация выполняется по порядку доступа, что иногда полезно, но поведение которого часто удивляет.)
Обратите внимание, что немодифицируемые коллекции введены в Java 9 (Set.of, Map.of,и т.д.) обеспечивает рандомизированный порядок итераций.Порядок будет отличаться от одного запуска JVM к другому.Это должно помочь приложениям избежать непреднамеренных зависимостей от порядка итерации.