410013796724260
• Webmoney
R335386147728
Z369087728698
Набор данных интерфейса SetРеализация интерфейса Set представляет собой неупорядоченную коллекцию, которая не может содержать дублирующие данные.
Интерфейс Set включает следующие методы :
К семейству интерфейса Set относятся HashSet, TreeSet и LinkedHashSet. В множествах Set разные реализации используют разный порядок хранения элементов. В HashSet порядок элементов оптимизирован для быстрого поиска. В контейнере TreeSet объекты хранятся отсортированными по возрастанию. LinkedHashSet хранит элементы в порядке добавления. Набор данных HashSetКонструкторы HashSet :// Создание пустого набора с начальной емкостью (16) и со // значением коэффициента загрузки (0.75) по умолчанию public HashSet(); // Создание множества из элементов коллекции public HashSet(Collection c); // Создание множества с указанной начальной емкостью и со // значением коэффициента загрузки по умолчанию (0.75) public HashSet(int initialCapacity); // Создание множества с указанными начальной емкостью и // коэффициентом загрузки public HashSet(int initialCapacity, float loadFactor); Методы HashSet
HashSet содержит методы аналогично ArrayList. Исключением является метод add(Object o), который добавляет объект только в том случае, если он отсутствует. Если объект добавлен, то метод add возвращает значение — true, в противном случае false. Пример использования HashSet :
HashSet<String> hashSet = new HashSet<String>();
hashSet.add("Картофель");
hashSet.add("Морковь" );
hashSet.add("Свекла" );
hashSet.add("Огурцы" );
// Следующая запись не должна попасть в набор
hashSet.add("Картофель");
// Вывести в консоль размер набора
System.out.println("Размер hashSet = " + hashSet.size());
// Вывести в консоль записи
Iterator<String> itr = hashSet.iterator();
while (itr.hasNext()) {
System.out.println(itr.next().toString());
}
В консоли мы должны увидеть только 4 записи. Следует отметить, что порядок добавления записей в набор будет непредсказуемым. HashSet использует хэширование для ускорения выборки. Пример использования HashSet с целочисленными значениями. В набор добавляем значения от 0 до 9 из 25 возможных случайным образом выбранных значений - дублирование не будет.
Random random = new Random(30);
Set<Integer> iset = new HashSet<Integer>();
for(int i = 0; i < 25; i++)
iset.add(random.nextInt(10));
// Вывести в консоль записи
Iterator<Integer> itr = iset.iterator();
while (itr.hasNext()) {
System.out.println(itr.next().toString());
}
Следует отметить, что реализация HashSet не синхронизируется. Если многократные потоки получают доступ к набору хеша одновременно, а один или несколько потоков должны изменять набор, то он должен быть синхронизирован внешне. Это лучше всего выполнить во время создания, чтобы предотвратить случайный несинхронизируемый доступ к набору :
Set<E> set = Collections.synchronizedSet(
new HashSet<E>());
Набор данных LinkedHashSetКласс LinkedHashSet наследует HashSet, не добавляя никаких новых методов, и поддерживает связный список элементов набора в том порядке, в котором они вставлялись. Это позволяет организовать упорядоченную итерацию вставки в набор. Конструкторы LinkedHashSet : // Создание пустого набора с начальной емкостью (16) и со значением коэффициента загрузки (0.75) по умолчанию public LinkedHashSet() // Создание множества из элементов коллекции public LinkedHashSet(Collection c) // Создание множества с указанной начальной емкостью и со значением коэффициента загрузки по умолчанию (0.75) public LinkedHashSet(int initialCapacity) // Создание множества с указанными начальной емкостью и коэффициентом загрузки public LinkedHashSet(int initialCapacity, float loadFactor) Также, как и HashSet, LinkedHashSet не синхронизируется. Поэтому при использовании данной реализации в приложении с множеством потоков, часть из которых может вносить изменения в набор, следует на этапе создания выполнить синхронизацию :
Set<E> set = Collections.synchronizedSet(
new LinkedHashSet<E>());
Набор данных TreeSetКласс TreeSet создаёт коллекцию, которая для хранения элементов использует дерево. Объекты хранятся в отсортированном порядке по возрастанию. Конструкторы TreeSet :// Создание пустого древовидного набора, с сортировкой согласно естественному // упорядочиванию его элементов TreeSet() // Создание древовидного набора, содержащего элементы в указанном наборе, // с сортировкой согласно естественному упорядочиванию его элементов. TreeSet(Collection<? extends E> c) // Создание пустого древовидного набора, с сортировкой согласно comparator TreeSet(Comparator<? super E> comparator) // Создание древовидного набора, содержащего те же самые элементы и использующего // то же самое упорядочивание в качестве указанного сортированного набора TreeSet(SortedSet<E> s) Методы TreeSet
В следующем измененном примере с использования TreeSet в консоль будут выведены значения в упорядоченном виде.
SortedSet<String> treeSet = new TreeSet<String>();
treeSet.add("Свекла" );
treeSet.add("Огурцы" );
treeSet.add("Помидоры" );
treeSet.add("Картофель");
treeSet.add("Морковь" );
// Данная запись не должна попасть в набор
treeSet.add("Картофель");
// Вывести в консоль размер набора
System.out.println("Размер treeSet = " + treeSet.size());
// Вывести в консоль записи
Iterator<String> itr = treeSet.iterator();
while (itr.hasNext()) {
System.out.println(itr.next().toString());
}
Random random = new Random(30);
SortedSet<Integer> iset = new TreeSet<Integer>();
for(int i = 0; i < 25; i++)
iset.add(random.nextInt(10));
// Вывести в консоль записи
Iterator<Integer> itr = iset.iterator();
while (itr.hasNext()) {
System.out.println(itr.next().toString());
}
|
