Видел фрагмент кода вроде
Set<Record> instances = new HashSet<Record>();
Мне интересно, не является ли Hashset особенным набором. Есть ли между ними разница?
Видел фрагмент кода вроде
Set<Record> instances = new HashSet<Record>();
Мне интересно, не является ли Hashset особенным набором. Есть ли между ними разница?
Ответы:
A Set
представляет собой общий «набор значений». A TreeSet
- это набор, в котором элементы отсортированы (и, следовательно, упорядочены), a HashSet
- это набор, в котором элементы не отсортированы и не упорядочены.
A HashSet
обычно намного быстрее, чем a TreeSet
.
A TreeSet
обычно реализуется как красно-черное дерево (см. Http://en.wikipedia.org/wiki/Red-black_tree - я не проверял фактическую реализацию sun / oracle TreeSet
), тогда как a HashSet
использует Object.hashCode()
для создания индекса в массив. Время доступа для красно-черного дерева равно O(log(n))
времени доступа для HashSet
диапазона от постоянного времени до наихудшего (каждый элемент имеет один и тот же хэш-код), где вы можете иметь линейное время поиска O(n)
.
На вопрос был дан ответ, но я не видел ответа, почему в коде упоминаются оба типа в одном коде.
Как правило, вы хотите кодировать интерфейсы, которые в данном случае установлены. Почему? Потому что, если вы всегда ссылаетесь на свой объект через интерфейсы (кроме new HashSet ()), тогда тривиально изменить реализацию объекта позже, если вы обнаружите, что было бы лучше сделать это, потому что вы упомянули об этом только один раз в своем коде. base (где вы сделали new HashSet ()).
Set - это коллекция, не содержащая повторяющихся элементов. Set - это интерфейс.
HashSet реализует Set
интерфейс, поддерживаемый хеш-таблицей (фактическиHashMap
экземпляром).
Поскольку HashSet
это одна из конкретных реализацийSet
интерфейса.
A Set
может быть любым из следующих, поскольку он был реализован следующими классами
ConcurrentSkipListSet : масштабируемая параллельная реализация NavigableSet на основе ConcurrentSkipListMap
. Элементы набора хранятся отсортированными в соответствии с их естественным порядком или по Comparator
времени создания набора, в зависимости от того, какой конструктор используется.
CopyOnWriteArraySet : набор, который использует внутренний CopyOnWriteArrayList для всех своих операций.
EnumSet : специализированная реализация Set для использования с перечисляемыми типами. Все элементы в наборе перечисления должны происходить из одного типа перечисления, который указывается, явно или неявно, при создании набора.
TreeSet : реализация NavigableSet на основе TreeMap. Элементы упорядочиваются с использованием их естественного порядка или с помощью компаратора, предоставляемого во время создания набора, в зависимости от того, какой конструктор используется.
LinkedHashSet : реализация таблицы пепла и связанного списка интерфейса Set с предсказуемым порядком итераций. Эта реализация отличается от HashSet тем, что поддерживает двусвязный список, проходящий через все его записи.
Но HashSet
может быть только LinkedHashSet
потому, что LinkedHashSet
подклассыHashSet
HashSet - это класс, производный от интерфейса Set. Как производный класс Set, HashSet приобретает свойства Set. Важными и наиболее часто используемыми производными классами Set являются HashSet и TreeSet.
**
** Это интерфейс, который является подтипом интерфейса Collection, как LIST и QUEUE.
Set имеет менее 3 подклассов, он используется для хранения нескольких объектов без дубликатов.
**
**
Может использовать одно значение NULL (поскольку дублирование не допускается), данные хранятся случайным образом, поскольку они не поддерживают последовательность.