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

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

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

– Карта

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

– LinkedHashMap

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

В конце концов, это точка этого classа.

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

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

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

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

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

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

 private final class KeySet extends AbstractSet {...} public abstract class AbstractSet extends AbstractCollection implements Set {...} 

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

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

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

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

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

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

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

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

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

Interesting Posts

Сохранить настройки в приложении .NET Winforms

Что такое расширение AppCompatActivity по сравнению с ActionBarActivity?

android viewPager реализация

Как добавить текст внизу страниц с помощью pdftk?

Unity Создать интерфейс пользовательского интерфейса из сценария

WCF HttpTransport: stream с буферизацией TransferMode

Как получить Windows 8.1 для включения корзины на съемном диске?

Как мне установить переменную PATH на моем Mac, чтобы найдены инструменты, установленные в Hombrew?

Как вы считаете строки кода в решении Visual Studio?

Совместное использование cookie между субдоменом и доменом

Загрузка асинхронного файла с помощью панели выполнения

Учитывая массив, узнайте следующий меньший элемент для каждого элемента

Преобразование типа данных timestamp в unix-метку времени Oracle

Windows 8 Pro, права на переучивание Windows 7 Pro и права на обновление Windows 10

Ионное изменение поведения кнопки BACK для конкретного controllerа

Давайте будем гением компьютера.