Возможно, вы захотите познакомиться с концепцией интерфейсов
Никита Рыбак
Ответы:
101
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).
Кроме того, существуют эти универсальные реализации: LinkedHashSet (вариант HashSet, который сохраняет некоторый порядок для Iterator), ConcurrentSkipListSet (реализация SortedSet с сохранением потоков), CopyOnWriteArraySet (поточно-безопасный вариант, оптимизированный для "большого количества чтений, очень редко пишет "), EnumSet (который работает только с перечисляемыми типами для элементов, но тогда даже быстрее, чем HashSet).
Паоло Эберманн
7
@Erik: Прошу отредактировать ваш ответ. TreeSet сортируется не упорядоченно. HashSet = неупорядоченный, TreeSet = отсортированный, LinkedHashSet = упорядоченный. Пожалуйста, измените свой ответ соответствующим образом
Раис Алам
Hashset может быть медленнее, если реализация hashCode плохая (например, всегда возвращать один и тот же хэш-код)
Я не понимаю этого комментария. Вопрос в том, «в чем разница», а не в том, «какие отношения между ними».
jambox 02
8
Он объяснил разницу: Set - это интерфейс, HashSet - это реализация этого интерфейса. Следовательно, это не разные реализации, просто HashSet является одной из реализаций Set (другой реализацией является TreeSet).
AggieDev
звучит как верный ответ для меня
Ромен Отфёй
3
Оставил вам голос против, потому что вы вообще не ответили на вопрос. В будущем я рекомендую вам добавить некоторую документацию, примеры и сравнения. Просто напишите одно предложение, и большая часть контента - это просто ссылки на другие места - это НЕ то, как вы отвечаете на вопросы о переполнении стека.
Urda
На этот вопрос был дан ответ 6 лет назад (см. Выше), но спасибо.
vaugham 01
16
На вопрос был дан ответ, но я не видел ответа, почему в коде упоминаются оба типа в одном коде.
Как правило, вы хотите кодировать интерфейсы, которые в данном случае установлены. Почему? Потому что, если вы всегда ссылаетесь на свой объект через интерфейсы (кроме new HashSet ()), тогда тривиально изменить реализацию объекта позже, если вы обнаружите, что было бы лучше сделать это, потому что вы упомянули об этом только один раз в своем коде. base (где вы сделали new HashSet ()).
Поскольку HashSetэто одна из конкретных реализацийSet интерфейса.
A Setможет быть любым из следующих, поскольку он был реализован следующими классами
ConcurrentSkipListSet : масштабируемая параллельная реализация NavigableSet на основе ConcurrentSkipListMap. Элементы набора хранятся отсортированными в соответствии с их естественным порядком или по Comparatorвремени создания набора, в зависимости от того, какой конструктор используется.
CopyOnWriteArraySet : набор, который использует внутренний CopyOnWriteArrayList для всех своих операций.
EnumSet : специализированная реализация Set для использования с перечисляемыми типами. Все элементы в наборе перечисления должны происходить из одного типа перечисления, который указывается, явно или неявно, при создании набора.
TreeSet : реализация NavigableSet на основе TreeMap. Элементы упорядочиваются с использованием их естественного порядка или с помощью компаратора, предоставляемого во время создания набора, в зависимости от того, какой конструктор используется.
LinkedHashSet : реализация таблицы пепла и связанного списка интерфейса Set с предсказуемым порядком итераций. Эта реализация отличается от HashSet тем, что поддерживает двусвязный список, проходящий через все его записи.
Но HashSetможет быть только LinkedHashSetпотому, что LinkedHashSetподклассыHashSet
Set - это общий интерфейс для коллекции, подобной множеству, а HashSet - это конкретная реализация интерфейса Set (который использует хеш-коды, отсюда и название).
HashSet - это класс, производный от интерфейса Set. Как производный класс Set, HashSet приобретает свойства Set. Важными и наиболее часто используемыми производными классами Set являются HashSet и TreeSet.
** Это интерфейс, который является подтипом интерфейса Collection, как LIST и QUEUE.
Set имеет менее 3 подклассов, он используется для хранения нескольких объектов без дубликатов.
HashSet
LinkedHashSet
TreeSet (который реализует интерфейс SortedSet)
**
HashSet:
**
Может использовать одно значение NULL (поскольку дублирование не допускается), данные хранятся случайным образом, поскольку они не поддерживают последовательность.
Ответы:
A
Set
представляет собой общий «набор значений». ATreeSet
- это набор, в котором элементы отсортированы (и, следовательно, упорядочены), aHashSet
- это набор, в котором элементы не отсортированы и не упорядочены.A
HashSet
обычно намного быстрее, чем aTreeSet
.A
TreeSet
обычно реализуется как красно-черное дерево (см. Http://en.wikipedia.org/wiki/Red-black_tree - я не проверял фактическую реализацию sun / oracleTreeSet
), тогда как aHashSet
используетObject.hashCode()
для создания индекса в массив. Время доступа для красно-черного дерева равноO(log(n))
времени доступа дляHashSet
диапазона от постоянного времени до наихудшего (каждый элемент имеет один и тот же хэш-код), где вы можете иметь линейное время поискаO(n)
.источник
Это
HashSet
реализацияSet
.источник
На вопрос был дан ответ, но я не видел ответа, почему в коде упоминаются оба типа в одном коде.
Как правило, вы хотите кодировать интерфейсы, которые в данном случае установлены. Почему? Потому что, если вы всегда ссылаетесь на свой объект через интерфейсы (кроме 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
источник
Set - это общий интерфейс для коллекции, подобной множеству, а HashSet - это конкретная реализация интерфейса Set (который использует хеш-коды, отсюда и название).
источник
Set - это родительский интерфейс для всех установленных классов, таких как TreeSet, LinkedHashSet и т. Д.
HashSet - это класс, реализующий интерфейс Set.
источник
HashSet - это класс, производный от интерфейса Set. Как производный класс Set, HashSet приобретает свойства Set. Важными и наиболее часто используемыми производными классами Set являются HashSet и TreeSet.
источник
**
** Это интерфейс, который является подтипом интерфейса Collection, как LIST и QUEUE.
Set имеет менее 3 подклассов, он используется для хранения нескольких объектов без дубликатов.
**
**
Может использовать одно значение NULL (поскольку дублирование не допускается), данные хранятся случайным образом, поскольку они не поддерживают последовательность.
источник