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

Я знаю, что LinkedHashMap имеет предсказуемый порядок итерации (порядок вставки). Возвращает ли Set, возвращаемый LinkedHashMap.keySet() и Collection, возвращаемый LinkedHashMap.values() этим порядком?

Ответ 1

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

- Map

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

- LinkedHashMap

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

Это точка этого класса, в конце концов.

Ответ 2

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

Ответ 3

Не путайте с LinkedHashMap.keySet() и LinkedHashMap.entrySet() возвратом Set и, следовательно, он не должен гарантировать упорядочение!

Set - это интерфейс с HashSet, TreeSet и т.д. его реализациями. Реализация интерфейса HashSet Set не гарантирует упорядочение. Но TreeSet делает. Также LinkedHashSet делает.

Следовательно, это зависит от того, как Set было реализовано в LinkedHashMap, чтобы узнать, будет ли возвращать задание Set гарантировать упорядочение или нет. Я просмотрел исходный код LinkedHashMap, он выглядит так:

private final class KeySet extends AbstractSet<K> {...}
public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E> {...}

Таким образом, LinkedHashMap/HashMap имеет собственную реализацию Set i.e. KeySet. Поэтому не путайте это с помощью HashSet.

Кроме того, порядок поддерживается тем, как элементы вставляются в ведро. Посмотрите на addEntry(..) метод LinkedHashMap и сравните его с параметром HashMap, который выделяет основное различие между HashMap и LinkedHashMap.

Ответ 4

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

Таким образом, в отсутствие какой-либо дополнительной квалификации он явно предназначен для применения ко всем этим итераторам.

Ответ 5

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

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

Ответ 6

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

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

Вы можете лучше создать, например, TreeSet с помощью keySet в конструкторе.

Ответ 7

Я не думаю, что вы можете предположить упорядочение keySet() и значений().

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