Коллекции Java: интерфейс Set

Введение Java Collections Framework [https://docs.oracle.com/javase/8/docs/technotes/guides/collections/index.html] - это фундаментальная и важная структура, которую любой сильный Java-разработчик должен знать как заднюю часть своего рука. Коллекция в Java определяется как группа или набор отдельных объектов, которые действуют как единый объект. В Java существует множество классов коллекций, и все они расширяют интерфейсы java.util.Collection и java.util.Map. Эти классы в основном предлагают

Вступление

Java Collections Framework

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

Коллекция в Java определяется как группа или набор отдельных объектов, которые действуют как единый объект.

В Java существует множество классов коллекций, и все они расширяют интерфейсы java.util.Collection и java.util.Map Эти классы в основном предлагают разные способы составить коллекцию объектов в одном объекте.

Коллекции Java - это среда, которая обеспечивает множество операций над коллекцией - поиск, сортировку, вставку, манипулирование, удаление и т. Д.

Это первая часть серии статей о Java Collections:

Наборы

Следующий общий интерфейс фреймворка - java.util.Set .

Наборы не предлагают дополнительных методов, кроме методов, унаследованных от интерфейса Collection

Set моделирует математическую абстракцию множества и не может содержать повторяющиеся элементы. При этом также стоит отметить, что эти элементы не имеют определенного порядка в наборе:

 List<String> names = Arrays.asList("David", "Scott", "Adam", "Jane", "Scott", "David", "Usman"); 
 System.out.println(names); 
 
 Set<String> uniqueNames = new HashSet<>(names); 
 System.out.println(uniqueNames); 

Выполнение этого фрагмента кода даст:

 [David, Scott, Adam, Jane, Scott, David, Usman] 
 [Adam, David, Jane, Scott, Usman] 

Как вы можете заметить, names списков содержат повторяющиеся записи, а набор uniqueNames удаляет повторяющиеся и распечатывает их без определенного порядка.

Добавление элемента

Используя метод add() , как и в Lists, мы можем добавлять объекты в Set:

 Set<String> uniqueNames = new HashSet<>(); 
 uniqueNames.add("David"); 
 uniqueNames.add("Scott"); 
 uniqueNames.add("Adam"); 
 uniqueNames.add("Jane"); 
 uniqueNames.add("Scott"); 
 uniqueNames.add("David"); 
 uniqueNames.add("Usman"); 
 
 System.out.println(uniqueNames); 

Выполнение этого фрагмента кода даст:

 [Adam, David, Jane, Scott, Usman] 

Удаление элементов

Используя логический remove() , мы можем удалить указанный элемент из этого набора, если он присутствует:

 System.out.println(uniqueNumbers.remove(2)); 
 
 System.out.println(uniqueNumbers); 

Выход:

 true 
 [1, 3] 

Другой вариант - использовать метод clear() для удаления всех элементов Set:

 List<String> names = Arrays.asList("David", "Scott", "Adam", "Jane", "Scott", "David", "Usman"); 
 Set<String> uniqueNames = new HashSet<>(names); 
 
 uniqueNames.clear(); 
 System.out.println(uniqueNames); 

Выполнение этого фрагмента кода даст:

 [] 

В качестве альтернативы мы могли бы полагаться на метод removeAll() :

 List<String> names = Arrays.asList("David", "Scott", "Adam", "Jane", "Scott", "David", "Usman"); 
 List<String> newNames = Arrays.asList("David", "Adam"); 
 Set<String> uniqueNames = new HashSet<>(names); 
 
 uniqueNames.removeAll(newNames); 
 System.out.println(uniqueNames); 

Выполнение этого фрагмента кода даст:

 [Jane, Scott, Usman] 

Важно отметить, что метод removeAll() принимает в качестве аргумента Collection Это можно использовать для удаления всех общих элементов из двух разных коллекций, в данном случае List и Set .

Также имейте в виду, что вы можете использовать этот метод для удаления всех элементов из самой Collection :

 uniqueName.removeAll(uniqueNames); 

Это, конечно, закончится пустым набором. Однако этот подход не рекомендуется, поскольку вызов removeAll() стоит намного дороже, чем метод clear() .

Это связано с тем, что removeAll() сравнивает каждый отдельный элемент из коллекции аргументов с коллекцией, которая вызывает метод, тогда как clear() просто указывает им всем на null и устанавливает размер на 0.

Содержит элемент

Используя логический contains() с заданным объектом, мы можем проверить, Set указанный элемент:

 List<String> names = Arrays.asList("David", "Scott", "Adam", "Jane", "Scott", "David", "Usman"); 
 Set<String> uniqueNames = new HashSet<>(names); 
 
 System.out.println(uniqueNames.contains("David")); 
 System.out.println(uniqueNames.contains("Scott")); 
 System.out.println(uniqueNames.contains("Adam")); 
 System.out.println(uniqueNames.contains("Andrew")); 

Выполнение этого кода даст:

 true 
 true 
 true 
 false 

Итерация элементов

Так же, как и со списками, хотя можно выполнять итерацию с for и enhanced-for , для этой задачи лучше использовать Iterator

 Set<E> set = new TreeSet<E>(); 
 ... 
 for(Iterator<E> iterator = set.iterator(); iterator.hasNext()) { 
 E element = iterator.next(); 
 element.someMethod(); 
 iterator.remove(element); 
 } 

Кроме того, Java 8 предлагает нам очень простой способ распечатать элементы с помощью ссылок на методы:

 set.forEach(System.out::println); 

Получение размера

Если вы хотите получить размер набора:

 List<String> names = Arrays.asList("David", "Scott", "Adam", "Jane", "Scott", "David", "Usman"); 
 Set<String> uniqueNames = new HashSet<>(names); 
 
 System.out.println(uniqueNames.size()); 

Выполнение этого фрагмента кода даст:

 5 

Проверка, если пусто

Если вы хотите запустить проверку, чтобы определить, является ли Set пустым, перед выполнением с ним каких-либо операций:

 List<String> names = Arrays.asList("David", "Scott", "Adam", "Jane", "Scott", "David", "Usman"); 
 Set<String> uniqueNames = new HashSet<>(names); 
 
 System.out.println(uniqueNames.isEmpty()); 

Выполнение этого фрагмента кода даст:

 false 

Реализации и различия

HashSet :

  • На основе HashMap (вызывает hashCode() для элемента и ищет его местоположение)
  • Хорошая реализация общего назначения (изменяется при нехватке места)

TreeSet :

  • На основе TreeMap (использует двоичное дерево с требуемым порядком сортировки)
  • Сохраняет элементы в заданном порядке

EnumSets :

  • Специализированная реализация для перечислений (использует битовый набор на основе порядкового номера перечисления)
  • Используется при хранении наборов перечислений

Алгоритмическое сравнение

performance_comparison_hashset_treeset_enumset{.ezlazyload}

Заключение

Фреймворк Java Collections - это фундаментальный фреймворк, который должен знать каждый Java-разработчик.

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

Если вам интересно узнать больше об интерфейсах коллекций, продолжайте читать - Коллекции Java: очереди, Deques и Stacks ( скоро ).

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus