Spec-Zone .ru
спецификации, руководства, описания, API
|
Set
реализации группируются в реализации специального назначения и общего назначения.
Есть три общего назначения Set
реализации — HashSet
TreeSet
LinkedHashSet
HashSet
намного быстрее чем TreeSet
(постоянно-разовый против разового журналом для большинства операций), но предложения никакие гарантии упорядочивания. Если Вы должны использовать операции в SortedSet
интерфейс, или если упорядоченный значением итерацию требуется, использует TreeSet
; иначе, использовать HashSet
. Это - ставка ярмарки, что Вы закончите тем, что использовали HashSet
большую часть времени.
LinkedHashSet
находится в некотором промежуточном звене смысла между HashSet
и TreeSet
. Реализованный как хэш-таблица со связанным списком, пробегающим это, это обеспечивает упорядоченную вставкой итерацию (наименее недавно вставленный к последний раз) и работает почти с такой скоростью, как HashSet
. LinkedHashSet
реализация спасает свои клиенты от неуказанного, обычно хаотического упорядочивания, обеспеченного HashSet
не подвергаясь увеличенной стоимости, связанной с TreeSet
.
Одна вещь стоящий учет о HashSet
та итерация, линейно в сумме числа записей и числа блоков (емкость). Таким образом выбирая начальную емкость это слишком высоко, может потратить впустую оба пространства и времени. С другой стороны выбирая начальную емкость это слишком низко, напрасно тратит время, копируя структуру данных каждый раз, когда она вынуждается увеличить свою емкость. Если Вы не определяете начальную емкость, значение по умолчанию 16. В прошлом было некоторое преимущество для выбора простого числа как начальная емкость. Это больше не истина. Внутренне, емкость всегда окружается к питанию два. Начальная емкость определяется при использовании int
конструктор. Следующая строка кода выделяет a HashSet
чья начальная емкость 64.
Set<String> s = new HashSet<String>(64);
HashSet
У class есть один другой настраивающий параметр, названный коэффициентом загрузки. Если Вы заботитесь много о потреблении пространства Вашего HashSet
, читайте HashSet
документация для получения дополнительной информации. Иначе, только примите значение по умолчанию; это - почти всегда правильная вещь сделать.
Если Вы принимаете коэффициент загрузки значения по умолчанию, но хотите определить начальную емкость, выберите число, которое это о дважды размере, к которому Вы ожидаете, что набор вырастет. Если Ваше предположение является путем прочь, можно потратить впустую немного пространства, время, или оба, но это вряд ли будет большая проблема.
LinkedHashSet
имеет те же самые настраивающие параметры как HashSet
, но на итеративное время не влияет емкость. TreeSet
не имеет никаких настраивающих параметров.
Есть два специального назначения Set
реализации — EnumSet
CopyOnWriteArraySet
EnumSet
высокоэффективное Set
реализация для перечислимых типов. Все элементы перечислимого набора должны иметь тот же самый перечислимый тип. Внутренне, это представляется битовый вектором, обычно сингл long
. Перечисление устанавливает итерацию поддержки по диапазонам перечислимых типов. Например, учитывая перечислимое объявление в течение дней недели, можно выполнить итерации за будние дни. EnumSet
class обеспечивает статическую фабрику, которая облегчает.
for (Day d : EnumSet.range(Day.MONDAY, Day.FRIDAY)) System.out.println(d);
Перечислимые наборы также обеспечивают богатую, безопасную с точки зрения типов замену для традиционных битовых флагов.
EnumSet.of(Style.BOLD, Style.ITALIC)
CopyOnWriteArraySet
a Set
реализация поддерживается массивом копии на записи. Все изменчивые операции, такой как add
, set
, и remove
, реализуются, делая новую копию массива; никакая блокировка никогда не требуется. Даже итерация может безопасно продолжиться одновременно со вставкой элемента и удалением. В отличие от этого больше всего Set
реализации, add
, remove
, и contains
методы требуют времени, пропорционального размеру набора. Эта реализация является только подходящей для наборов, которые редко изменяются, но часто выполняются с помощью итераций. Это хорошо подходит для поддержания списков обработчика событий, которые должны предотвратить копии.