Подтвердить что ты не робот

Какая разница между HashSet и Set?

Выделите фрагмент кода, например

Set<Record> instances = new HashSet<Record>();

Мне интересно, является ли Hashset особым типом набора. Любая разница между ними?

4b9b3361

Ответ 1

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).

Ответ 2

HashSet является реализацией Set.

Ответ 3

Ответ был дан, но я не видел ответа на вопрос, почему код упоминает оба типа в одном и том же коде.

Как правило, вы хотите кодировать интерфейсы, которые в этом случае являются Set. Зачем? Потому что, если вы всегда ссылаетесь на свой объект через интерфейсы (кроме нового HashSet()), тогда тривиально изменить реализацию объекта позже, если вы обнаружите, что было бы лучше сделать это, потому что вы только упоминали его один раз в своем коде base (где вы сделали новый HashSet()).

Ответ 4

Set - это общий интерфейс для коллекции, подобной набору, а HashSet - это конкретная реализация интерфейса Set (который использует хеш-коды, отсюда и название).

Ответ 5

Набор - это коллекция, которая не содержит повторяющихся элементов. 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

Ответ 6

Set является родительским интерфейсом для всех заданных классов, таких как TreeSet, LinkedHashSet и т.д.

HashSet - это класс, реализующий интерфейс Set.

Ответ 7

HashSet - это класс, производный от интерфейса Set. Как производный класс Set, HashSet достигает свойств Set. Важными и наиболее часто используемыми производными классами Set являются HashSet и TreeSet.