Гарантирован ли порядок возврата ключей и значений из объекта LinkedHashMap?

141
задан Machavity 24 January 2019 в 13:26
поделиться

5 ответов

Интерфейс Map предоставляет три вида представлений. представления коллекции, которые позволяют рассматривать содержимое карты как набор ключей, коллекцию значений или набор сопоставлений ключ-значение. Порядок порядок в карты определяется как порядок, в котором итераторы коллекции карты возвращают свои элементы. Некоторые карты реализации, такие как TreeMap класс, дают конкретные гарантии относительно их порядка; другие, такие как HashMap, не делают этого.

-- Map

Этот связный список определяет итерационное порядок, который обычно является порядком в котором ключи были вставлены в map (insertion-order).

-- LinkedHashMap

Итак, да, keySet(), values() и entrySet() (три упомянутых представления коллекции) возвращают значения в порядке, который использует внутренний связный список. И да, JavaDoc для Map и LinkedHashMap гарантируют это.

В этом, в конце концов, и заключается смысл этого класса.

217
ответ дан 23 November 2019 в 22:06
поделиться

AFAIK это не документировано, поэтому вы не можете "формально" так считать. Однако маловероятно, что текущая реализация изменится.

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

0
ответ дан 23 November 2019 в 22:06
поделиться

Можно предположить, что это так. В Javadoc говорится о "предсказуемом порядке итераций", а единственными итераторами, доступными в Map, являются итераторы для keySet(), entrySet() и values().

Так что в отсутствие дальнейших оговорок очевидно, что он предназначен для применения ко всем этим итераторам.

5
ответ дан 23 November 2019 в 22:06
поделиться

Если посмотреть на источник, то похоже, что это так. keySet(), values(), и entrySet() все используют один и тот же итератор записей.

11
ответ дан 23 November 2019 в 22:06
поделиться

Если посмотреть на интерфейс, то он возвращает обычное Set, а не SortedSet. Поэтому нет никаких гарантий.

Прежде чем предполагать неявные гарантии, глядя на реализацию (всегда плохая идея), посмотрите также на реализацию во всех других реализациях Java :)

Лучше создать, например, TreeSet с keySet в конструкторе.

-3
ответ дан 23 November 2019 в 22:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: