Почему 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 отсутствует тип коллекции, который представляет собой последовательность элементов с определенным порядком встречи. Ему также не хватает единообразного набора операций, применимых к таким коллекциям. Эти пробелы неоднократно служили источником проблем и жалоб.

[…]

Это прискорбное положение дел. Концепция коллекции с определенным порядком встреч существует во многих местах в структуре коллекций, но не существует единого типа, который бы ее представлял. В результате некоторые операции над такими коллекциями оказываются несогласованными или отсутствуют, а обработка элементов в обратном порядке может быть от неудобной до невозможной. Мы должны заполнить эти пробелы.

Другие вопросы по тегам