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