Я знаю, что LinkedHashMap
имеет предсказуемый порядок итерации (порядок вставки). Возвращает ли Set
, возвращаемый LinkedHashMap.keySet()
и Collection
, возвращаемый LinkedHashMap.values()
этим порядком?
Гарантирован ли заказ для возврата ключей и значений из объекта LinkedHashMap?
Ответ 1
Интерфейс карты обеспечивает три коллекции, которые позволяют просматривать содержимое карты как набор ключей, набор значений или набор отображений значений ключа. Получатель чего-то карта определяется как порядок, в котором итераторы на карте взгляды возвращают свои элементы. Некоторая карта реализаций, таких как
TreeMap
класса, предоставлять конкретные гарантии относительно их порядок; другие, какHashMap
класс, не.
- Map
Этот связанный список определяет итерацию заказ, который обычно является порядком в котором ключи были вставлены в map (порядок вставки).
Итак, да, 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.