Я знаю, LinkedHashMap
имеет предсказуемый порядок итераций (порядок вставки). Поддерживает ли Set
возвращенный LinkedHashMap.keySet()
и Collection
возвращаемый LinkedHashMap.values()
также этот порядок?
java
iteration
linkedhashmap
user256239
источник
источник
values()
так иkeySet()
я, я расширил вопрос, чтобы включить это. Это означает, что больше вопросов могут быть закрыты как дубликаты этого.Ответы:
- Карта
- LinkedHashMap
Так что , да,
keySet()
,values()
, иentrySet()
(три мнения сбора упоминается) возвращаемые значения в порядке внутреннего связанного список использование. И да, JavaDoc дляMap
иLinkedHashMap
гарантировать его.В этом смысл этого класса, в конце концов.
источник
Collection
- это просто базовый класс, для которого возвращается values (). Реализация коллекции, которую он возвращает, все еще контролируетсяLinkedHashMap
. В этомLinkedHashMap
случае он возвращаетLinkedValues
экземпляр, закрытый класс внутри LinkedHashMap.java.Map
), которая явно связывает порядок карты с итераторами в представлениях коллекции карты (и проясняете, каковы эти представления коллекции). Это был недостающий кусок для меня.Глядя на источник, похоже, что так и есть.
keySet()
,values()
иentrySet()
все используют один и тот же итератор записи внутри.источник
Не путайте
LinkedHashMap.keySet()
и неLinkedHashMap.entrySet()
возвращайте Set, и, следовательно, это не должно гарантировать заказ!Set
интерфейс сHashSet
, иTreeSet
т.д. существа его реализации.HashSet
РеализацияSet
интерфейса не гарантирует порядок. НоTreeSet
делает. ТакжеLinkedHashSet
делает.Следовательно, зависит от того, как
Set
было реализовано,LinkedHashMap
чтобы знать, будет ли возвращение ссылки Set гарантировать порядок или нет. Я прошел через исходный кодLinkedHashMap
, это выглядит так:Таким образом, LinkedHashMap / HashMap имеет собственную реализацию
Set
ieKeySet
. Таким образом, не путайте это сHashSet
.Кроме того, порядок поддерживается тем, как элементы вставляются в ведро. Посмотрите на
addEntry(..)
методLinkedHashMap
и сравните его с тем,HashMap
который подчеркивает основное различие междуHashMap
иLinkedHashMap
.источник
Вы можете предположить, что так. В Javadoc написано «предсказуемый порядок итераций», и единственные итераторы, доступные на карте, - это те, которые предназначены для keySet (), entrySet () и values ().
Таким образом, при отсутствии какой-либо дополнительной квалификации он явно предназначен для применения ко всем этим итераторам.
источник
AFAIK это не задокументировано, поэтому вы не можете «формально» предполагать это Однако маловероятно, что текущая реализация изменится.
Если вы хотите обеспечить порядок, вы можете перебрать все карты и вставить их в отсортированный набор с выбранной вами функцией заказа, хотя, естественно, вы будете платить за производительность.
источник
Глядя на интерфейс, он возвращает простой,
Set
а неSortedSet
. Так что нет никаких гарантий.Прежде чем принять на себя неявную гарантию, взглянув на реализацию (всегда плохая идея), также посмотрите на реализации во всех других реализациях Java :)
Вы могли бы лучше создать, например, TreeSet с keySet в конструкторе.
источник
Я не думаю, что вы можете предполагать порядок keySet () и values ().
Я могу легко написать реализацию LinkedHashMap, которая возвращает вам неупорядоченные keySet () и values (), если я придерживаюсь контракта этих двух методов, которые определены в Map и переопределены в HashMap.
источник
LinkedHashMap
класса является сохранение порядка элементов во время итерации карты, и это поведение хорошо определено. Если вы пишете подкласс без соблюдения спецификации базового класса, то вы делаете что-то очень неправильное.