Набор данных интерфейса Set

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

Интерфейс Set включает следующие методы :

МетодОписание
add(Object o) Добавление элемента в коллекцию, если он отсутствует. Возвращает true, если элемент добавлен.
addAll(Collection c) Добавление элементов коллекции, если они отсутствуют.
clear() Очистка коллекции.
contains(Object o) Проверка присутствия элемента в наборе. Возвращает true, если элемент найден.
containsAll(Collection c) Проверка присутсвия коллекции в наборе. Возвращает true, если все элементы содержатся в наборе.
equals(Object o) Проверка на равенство.
hashCode() Получение hashCode набора.
isEmpty() Проверка наличия элементов. Возвращает true если в коллекции нет ни одного элемента.
iterator() Функция получения итератора коллекции.
remove(Object o) Удаление элемента из набора.
removeAll(Collection c) Удаление из набора всех элементов переданной коллекции.
retainAll(Collection c) Удаление элементов, не принадлежащих переданной коллекции.
size() Количество элементов коллекции
toArray() Преобразование набора в массив элементов.
toArray(T[] a) Преобразование набора в массив элементов. В отличии от предыдущего метода, который возвращает массив объектов типа Object, данный метод возвращает массив объектов типа, переданного в параметре.

К семейству интерфейса 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

  • public int size()
  • public boolean isEmpty()
  • public boolean add(Object o)
  • public boolean addAll(Collection c)
  • public boolean remove(Object o)
  • public boolean removeAll(Collection c)
  • public boolean contains(Object o)
  • public void clear()
  • public Object clone()
  • public Iterator iterator()
  • public Object[] toArray()
  • public boolean retainAll(Collection c)

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

  • boolean add(Object o)
  • boolean addAll(Collection<? extends E> c)
  • Object ceiling(Object o)
  • void clear()
  • TreeSet clone()
  • Comparator<? super E> comparator()
  • boolean contains(Object o)
  • Iterator<Object> descendingIterator()
  • NavigableSet<Object> descendingSet()
  • Object first()
  • Object floor(Object o)
  • SortedSet<E> headSet(E e)
  • NavigableSet<E> headSet(E e, boolean inclusive)
  • Object higher(Object o)
  • boolean isEmpty()
  • Iterator<E> iterator()
  • E last()
  • E lower(E e)
  • E pollFirst()
  • E pollLast()
  • boolean remove(Object o)
  • int size()
  • Spliterator<E> spliterator()
  • NavigableSet<E> subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive)
  • SortedSet<E> subSet(E fromElement, E toElement)
  • SortedSet<E> tailSet(E fromElement)
  • NavigableSet<E> tailSet(E fromElement, boolean inclusive)

В следующем измененном примере с использования 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());
}
Наверх
  Рейтинг@Mail.ru