Почему LinkedHashSet не имеет метода addFirst? - PullRequest
0 голосов
/ 21 декабря 2018

Как указано в документации LinkedHashSet, это

Реализация хеш-таблицы и связанного списка интерфейса Set с предсказуемым порядком итераций.Эта реализация отличается от HashSet тем, что поддерживает двусвязный список, проходящий через все его записи.

Так что, по сути, это HashSet с очередью ключей FIFO, реализованной связанным списком.Учитывая, что LinkedList равен Deque и допускает, в частности, вставку в начале, мне интересно, почему LinkedHashSet не имеет метода addFirst(E e) в дополнение к методам, присутствующим в интерфейсе Set.Кажется, это не сложно реализовать.

1 Ответ

0 голосов
/ 21 декабря 2018

Как сказал Элиотт Фриш, ответ содержится в следующем предложении цитируемого вами абзаца:

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

Метод addFirst нарушил бы порядок вставки и, следовательно, идею дизайна LinkedHashSet.

Если бы я мог добавить немного догадок, другие возможные причины могли быinclude:

  • Это не так просто реализовать, как кажется, так как LinkedHashSet действительно реализован как LinkedHasMap, где отображаемые значения не используются.По крайней мере, вам также придется изменить этот класс (который, в свою очередь, также нарушил бы его порядок вставки и, следовательно, его идею дизайна).
  • Как и предполагал другой парень в комментарии,они не сочли это полезным.

Тем не менее, вы задаете вопрос неправильно.Они разработали класс с функциональностью, в которой они видели необходимость.Они перешли к реализации, используя хеш-таблицу и связанный список.Вы начинаете с реализации и используете ее в качестве основы для обсуждения дизайна.Хотя иногда это может добавить что-то полезное, обычно это не путь к хорошим проектам.

Хотя теоретически я могу понять, что в вашей ситуации может возникнуть ситуация, когда вам понадобится двусторонняя очередь с заданным свойством (дубликаты)игнорируются / исключаются), мне трудно представить, когда Deque не будет отвечать вашим потребностям в этом случае (Элиотт Фриш упомянул недоиспользуемый ArrayDeque).Вам нужны довольно большие объемы данных и / или довольно строгие требования к производительности, прежде чем линейная сложность contains и remove станет непомерно высокой.И в этом случае вам, возможно, уже будет лучше разрабатывать собственную структуру данных.

...