Нет ListIterator в LinkedHashMap и LinkedHashSet

Хотя в документации конкретно указано, что как LinkedHashMap, так и LinkedHashSet

поддерживает двусвязный список, проходящий через все его записи

Я не понимаю, почему эти реализации не возвращают ListIterator для перехода к следующему и предыдущему. Кто-нибудь знает об ограничениях под капотом?


person DED    schedule 09.10.2014    source источник


Ответы (2)


ListIterator открывает возможность вставки через них «в текущей позиции итератора». Но это нарушает порядок, установленный самим LinkedHashMap / Set, потому что в их контракте говорится, что порядок списка будет строго равен порядку вставки.

person Erwin Smout    schedule 09.10.2014
comment
Звучит разумно, но сбивает с толку то, что LinkedList действительно возвращает ListIterator. Подобно структурам, которые я упоминаю, LinkedList имеет двойную связь и должен поддерживать исходный порядок вставки. - person DED; 10.10.2014
comment
Нет. LinkedList позволяет вставлять в указанные позиции. - person Erwin Smout; 10.10.2014
comment
Понятно, потому что он реализует интерфейс List, а LinkedHashMap / Set - нет. Затем двойное связывание полезно при получении обратного итератора. - person DED; 10.10.2014

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

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

Может быть, вы хотите map.entrySet().iterator() здесь, хотя я согласен, что это набор, и порядок технически не определен ...

person Joffrey    schedule 09.10.2014