HashSet использует HashTable в качестве структуры данных и HashMap в качестве коллекции? Не рекомендуется использовать массивы точек памяти? - PullRequest
0 голосов
/ 07 июня 2018

Согласно this

Базовая структура данных для HashSet является хеш-таблицей.

Но я также читал, что HashSet внутренне использует HashMap, чтобы избежатьдублирующиеся значения, которые в свою очередь внутренне используют массив блоков и LinkedList (заменен на дерево в Java 8)

Так правильно ли говорить, что HashSet использует HashTable в качестве структуры данных, а HashMap в качестве коллекции?

TreeSet реализует интерфейс SortedSet, поэтому повторяющиеся значения не допускаются.

Означает ли это, что TreeSet не использует HashMap для внутреннего использования, который используется HashSet для избежания дублирования значений? Использует ли LinkedHashSet для внутреннего использования HashMap?

Согласно это

Не рекомендуется использовать массивы точек памяти.

Почему?То, что я читал раньше -

Поскольку ArrayList не может быть создан для примитивных типов данных, члены ArrayList всегда являются ссылками на объекты в разных местах памяти (подробности см. В этом разделе).Поэтому в ArrayList фактические объекты никогда не хранятся в смежных местах.Ссылки на реальные объекты хранятся в смежных местах.В массиве это зависит, является ли массив массивом примитивного типа или типом объекта.В случае примитивных типов фактические значения представляют собой смежные местоположения, но в случае объектов распределение аналогично ArrayList.

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Существует разница между хеш-таблицей в нижнем регистре, которая является обычно определенной структурой данных, и классом java Hashtable, который является синхронизированной реализацией хеш-таблицы в Java, предшествующей HashMap и HashSet классы.HashSet вообще не использует класс Hashtable.Вместо этого он использует (опять-таки, строчная h) структура данных хеш-таблицы, которая реализована с использованием HashMap.Hashtable редко, если вообще используется в современном коде.Согласно javadocs для Hashtable:

Если не требуется поточно-ориентированная реализация, рекомендуется использовать HashMap вместо Hashtable.Если требуется высококонкурентная реализация, ориентированная на многопотоковое исполнение, то вместо Hashtable рекомендуется использовать ConcurrentHashMap.

Что касается других ваших вопросов:

  • TreeSet используетполностью отличная структура данных от хеш-таблицы, называемая красно-черным деревом.См., Например, этот подробный ответ для обзора различий между HashSet и TreeSet.
  • Я не уверен, что означает эта цитата для "массивов точек памяти".Этот сайт не очень хорошо написан.
0 голосов
/ 07 июня 2018

Так правильно ли говорить, что HashSet использует HashTable в качестве структуры данных и HashMap в качестве коллекции?

Не совсем.Хотя Java имеет класс Hashtable, который восходит к Java 1.0, но реализация HashSet не делит код с этим классом.В статье Geeks For Geeks утверждается, что HashSet использует структуру данных хеш-таблицы без ссылки на какой-либо конкретный класс.Они утверждают, что HashSet использует подход и алгоритмы хеш-таблиц, что верно: путем повторного использования кода HashMap, который основан на подходе хеш-таблиц для построения ассоциативных контейнеров, HashSet использует подход хеш-таблиц какхорошо.

Означает ли это, что TreeSet не использует HashMap внутренне, что используется HashSet, чтобы избежать дублирования значений?

TreeSetиспользует TreeMap, который использует основанный на сравнении (а не основанный на хешах) подход обеспечения уникальности своих ключей.

Использует ли LinkedHashSet HashMap для внутреннего использования?

Да.LinkedHashSet наследуется от HashSet, поэтому косвенно использует HashMap.

...