Почему LinkedHashSet не имеет метода addFirst?
Как документация LinkedHashSet
утверждает, что это
Реализация хэш-таблицы и связанного списка интерфейса Set с предсказуемым порядком итераций. Эта реализация отличается от HashSet тем, что поддерживает двусвязный список, проходящий через все его записи.
Так что это по сути HashSet
с FIFO очередью ключей, реализованной в виде связанного списка. Учитывая, что LinkedList
является Deque
и разрешает, в частности, вставку в начале, интересно, почему не LinkedHashSet
иметь addFirst(E e)
метод в дополнение к методам, присутствующим в Set
интерфейс. Кажется, это не сложно реализовать.
2 ответа
Как сказал Элиотт Фриш, ответ в следующем предложении приведенного вами абзаца:
… Этот связанный список определяет порядок итераций, то есть порядок, в котором элементы были вставлены в набор (порядок вставки)....
addFirst
метод будет нарушать порядок вставки и, следовательно, идея дизайна LinkedHashSet
,
Если я могу добавить немного догадок, другие возможные причины могут включать в себя:
- Это не так просто реализовать, как кажется
LinkedHashSet
действительно реализован какLinkedHasMap
где сопоставленные значения не используются. По крайней мере, вам также придется изменить этот класс (что, в свою очередь, также нарушит порядок его вставки и, следовательно, идею дизайна). - Как тот другой парень, возможно, намеревался в комментарии, они не нашли это полезным.
Тем не менее, вы задаете вопрос неправильно. Они разработали класс с функциональностью, в которой они видели необходимость. Они перешли к реализации, используя хеш-таблицу и связанный список. Вы начинаете с реализации и используете ее в качестве основы для обсуждения дизайна. Хотя иногда это может добавить что-то полезное, обычно это не путь к хорошему дизайну.
В то время как я теоретически могу понять вашу точку зрения, что может возникнуть ситуация, когда вам понадобится двусторонняя очередь с заданным свойством (дубликаты игнорируются / удаляются), но мне трудно представить, когда Deque
не будет отвечать вашим потребностям в этом случае (Элиотт Фриш упомянул ArrayDeque
). Вам нужны довольно большие объемы данных и / или довольно строгие требования к производительности, прежде чем линейная сложность contains
а также remove
было бы непомерно. И в этом случае вам, возможно, уже будет лучше разрабатывать собственную структуру данных.
The Метод добавляется функцией JEP 431: Sequenced Collections . Это запланировано в следующей версии 21 Java.
public void addFirst(E e)
Добавляет элемент в качестве первого элемента этой коллекции (необязательная операция). После нормального завершения этой операции данный элемент станет членом этой коллекции и будет первым элементом в порядке обнаружения.
Если этот набор уже содержит элемент, он при необходимости перемещается так, чтобы он был первым в порядке обнаружения.
Параметры:
e
- элемент, который нужно добавитьС:
21
Функция упорядоченных коллекций добавляет три новых интерфейса:,(который расширяет ), иSequencedCollection<E>
. Существующие классы и интерфейсы были модернизированы для использования новых интерфейсов:SortedSet
& осуществлятьSequencedSet
,List
иDeque
реализовать, иSortedMap
иLinkedHashMap
осуществлятьSequencedMap
.
Метод on определен вSequencedCollection
.
Предложение по улучшению JDK не объясняет, почемуLinkedHashSet
не былоaddFirst
метод раньше. Но в разделе «Мотивация» объясняется, почему этот и другие методы, связанные с последовательностями, добавляются сейчас.
В структуре коллекций Java отсутствует тип коллекции, который представляет собой последовательность элементов с определенным порядком встречи. Ему также не хватает единообразного набора операций, применимых к таким коллекциям. Эти пробелы неоднократно служили источником проблем и жалоб.
[…]
Это прискорбное положение дел. Концепция коллекции с определенным порядком встреч существует во многих местах в структуре коллекций, но не существует единого типа, который бы ее представлял. В результате некоторые операции над такими коллекциями оказываются несогласованными или отсутствуют, а обработка элементов в обратном порядке может быть от неудобной до невозможной. Мы должны заполнить эти пробелы.