Каковы плюсы и минусы TreeSet [закрыто]

просто интересно, какие плюсы и минусы TreeSet, если кто-нибудь может сказать мне, пожалуйста? Спасибо!

5 ответов


один из классов коллекций. Это позволяет получить доступ к элементам коллекции по ключу, или последовательно по ключу. Он имеет значительно больше накладных расходов, чем ArrayList или HashMap. Используйте HashSet, когда вам не нужен последовательный доступ, просто поиск по ключу. Используйте ArrayList и используйте массивы. сортировка, если вы просто хотите элементы в порядке. TreeSet хранит элементы в порядке в любое время. С ArrayList вы просто, когда вам нужно. С помощью TreeSets ключ должен быть встроен в объект, в котором вы храните коллекция. Часто у вас может быть TreeSet строк. Все, что вы можете сделать, это сказать, находится ли данная строка в наборе. Он не найдет вам Связанный объект, как это сделает Treemap. С помощью TreeMap ключи и объекты, с которыми они связаны, являются отдельными.

TreeSet и его брат TreeMap странно не имеют ничего общего с представлением деревьев. Внутренне они используют древовидную организацию, чтобы дать вам алфавитно отсортированный набор / карту, но у вас нет контроля над связями между родителями и детей.

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

Если вы не поставляете компаратор для определения заказа, который вы хотите, TreeSet требует сопоставимой реализации в классе item для определения естественного порядка.


минусы: одна из ловушек с TreeSet заключается в том, что он реализует интерфейс Set неожиданным образом. Если набор деревьев содержит объект a, то объект b считается частью набора, если a.compareTo (b) возвращает 0, даже если a.equals (b) является ложным, поэтому, если compareTo и equals не реализованы последовательно, вы находитесь в плохой поездке.

Это особенно проблема, когда метод возвращает набор, и вы не знаете, является ли реализация набором деревьев или, например, Для поиска HashSet.

урок, чтобы узнать здесь, всегда избегать реализации compareTo и равно непоследовательно. Если вам нужно упорядочить объекты таким образом, чтобы это не соответствовало equals, используйте компаратор.


TreeSet:
Плюсы: сортировка, основанная на алгоритме красного/черного дерева, обеспечивает o(log (N)) сложность операций.
Минусы: значение должно быть сравнима или вам нужно, чтобы обеспечить компаратор в конструкторе. Кроме того, реализация HashSet обеспечивает лучшую производительность, поскольку она обеспечивает сложность ~O(1).


TreeSet фрагментирует память и имеет дополнительные накладные расходы памяти. Вы можете посмотреть на источники и рассчитать объем дополнительной памяти и количество дополнительных объектов, которые он создает. Конечно, это зависит от природы хранимых объектов, и вы также можете подозревать меня в паранойе относительно памяти :) но лучше не тратить его здесь и там - у вас есть GC, у вас есть пропуски кэша, и все эти вещи slooow.

часто вы можете использовать PriorityQueue вместо TreeSet. И в ваш типичный случай использования лучше просто отсортировать массив строк.


Я думаю, что эта datastructure будет использовать двоичное дерево для поддержания данных, чтобы можно было получить восходящий порядок. В этом случае, если он попытается сохранить дерево в равновесии, операция удаления будет немного дорогостоящей.