Устойчивая проблема упорядочения элементов при итерации 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
) и порядок итераций - не порядок вставки, а порядок ключей:
Карта упорядочена в соответствии с естественным порядком ее ключей или с помощью компаратора, который обычно предоставляется во время создания отсортированной карты.