A HashSet
не реализует интерфейс List
.И значения в Set
не индексируются.Мы не можем получить значение из Set
.
Так что, если вам просто нужно хранилище для уникальных значений, вы можете смело использовать реализацию Set
.Если вам нужно сохранить порядок вставки или если вам нужны какие-либо другие функции List
реализаций и уникальности, то используйте метод из вашего вопроса: украсьте существующую реализацию List
и добавьте функциональность, чтобы отклонять дубликаты.
Вы спрашивали об эффективности: ArrayList
поддерживается массивом и довольно быстро.Но временная сложность для contains()
- это O (n) - для итерации нам нужно рассмотреть каждый элемент в худшем случае.
HashSet
более или менее является полным декоратором HashMap
немного тяжелее по сравнению с array
.Но сложность времени для contains
равна O (1) - проверка выполняется в постоянное время, независимо от того, сколько элементов находится внутри карты.
Если вы просто хотите выполнить итерацию - специализированная реализация List
должно быть немного быстрее - оба имеют временную сложность O (n) для итерации (не удивительно), но чтение из массива легче, чем чтение с карты.