Устойчивая проблема упорядочения элементов при итерации HashMap в Java 8

Некоторые тестовые случаи терпят неудачу в моем приложении, которое зависит от порядка вставки элемента. Раньше он нормально работал в Java 7, но эта проблема возникла после обновления до Java 8. При поиске в Интернете я нашел это в статье:

Java 8 включает некоторые возможные изменения в порядке итерации HashSet/Map:

Могут ли некоторые предложить мне - как я могу перебирать объекты на карте в том же порядке, что и порядок вставки в карту, учитывая, что я все еще буду использовать Java 1.8 в своей среде разработки?

Да, конечно, HashMap никогда не гарантировал, что объекты могут быть получены в том же порядке, но да, он работал в Java 7.

Есть ли LinkedHashMap работать, чтобы реализовать это?

1 ответ

Да, вы должны использовать LinkedHashMap который имеет стабильный порядок итераций даже в версиях Java, что обеспечивается его контрактом:

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

В нескольких случаях нам также требовался повторяющийся порядок итераций в разных версиях Java и LinkedHashMap работал просто отлично.


TreeMap также будет решением для стабильного порядка итераций. Конечно, он имеет логарифмическое время работы (в отличие от постоянного в LinkedHashMap) и порядок итераций - не порядок вставки, а порядок ключей:

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

Другие вопросы по тегам