Почему Java предоставляет несколько различных реализаций типа Set
, включая HashSet
и TreeSet
и not ArraySet
?
Нет реализаций Java для массива
Ответ 1
Набор, основанный исключительно на массиве элементов без особого порядка, всегда будет иметь время O (n) для проверки сдерживания. Это было бы не очень полезно, ИМО. Когда вы захотите использовать это вместо HashSet
или TreeSet
?
Наиболее полезным аспектом массива является то, что вы можете быстро получить элемент с определенным индексом. Это не очень важно, когда дело доходит до наборов.
Ответ 2
Существует CopyOnWriteArraySet, который представляет собой набор, поддерживаемый массивом.
Это не особенно полезно, так как его производительность не велика для больших коллекций.
Ответ 3
Интерфейс Set
не имеет метода get-by-index, такого как List.get(int)
, поэтому нет необходимости использовать массив с поддержкой массива.
В конечном счете, все классы "группировки" используют массивы под капотом для хранения своих элементов, но это не значит, что вам нужно выставлять методы для доступа к массиву.
Ответ 4
На самом деле конкретная реализация Set не имеет никакого смысла. Любой набор хранит элементы и гарантирует их уникальность.
Я не могу быть уверен, но кажется, что вы хотите, чтобы реализация Set сохраняла порядок элементов. Если я правильно использую LinkedHashSet
.
Ответ 5
Java предоставляет несколько реализаций своих интерфейсов Collection
, которые обеспечивают лучшую производительность. ArrayList
работает хорошо во многих операциях List
.
Для Set
Операции, которые всегда требуют уникальных различных реализаций, обеспечивают лучшую производительность. Если реализовано с использованием массива, любая операция модификации должна выполняться через все элементы массива, чтобы проверить, все ли они в Set. HashSet и TreeSet просто проверяют эту проверку.
Ответ 6
Android имеет android.util.ArraySet (введен в API-уровне 23) и android.util.ArrayMap (введен в API уровня 19).
Ответ 7
Вы всегда можете реализовать его самостоятельно.... теперь предоставляется там, вероятно, только один чрезвычайно ограниченный случай, когда это было бы полезно (и в этом случае вы могли бы использовать лучшие структуры данных в любом случае), и именно там у вас есть очень большой набор, который почти никогда не меняется, тогда набор массивов будет занимать МНОГИЕ меньше памяти (без дополнительных указателей), и у вас было бы так немного более быстрое перечисление всего набора... Если вы сохраните отсортированный массив, то вы все равно сможете получить O (lg n) времени поиска.
Однако эти различия носят чисто академический характер. В реальном мире вы никогда не захотите такого зверя
Ответ 8
Рассмотрим indexed-tree-map, вы сможете получить доступ к элементам по индексу и получить индекс элементов, сохраняя порядок сортировки. Дубликаты могут быть помещены в массивы как значения под одним и тем же ключом.