Вступление
- это фундаментальная и важная среда, которую любой сильный Java-разработчик должен знать как свои пять пальцев.
Коллекция в Java определяется как группа или набор отдельных объектов, которые действуют как единый объект.
В Java существует множество классов коллекций, и все они расширяют
интерфейсы java.util.Collection
и java.util.Map
Эти классы в
основном предлагают разные способы составить коллекцию объектов в одном
объекте.
Коллекции Java - это среда, которая обеспечивает множество операций над коллекцией - поиск, сортировку, вставку, манипулирование, удаление и т. Д.
Это первая часть серии статей о Java Collections:
- Интерфейс списка
- Интерфейс набора ( вы здесь )
- Интерфейс карты
- Интерфейсы Queue и Deque
Наборы
Следующий общий интерфейс фреймворка - 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 :
- Специализированная реализация для перечислений (использует битовый набор на основе порядкового номера перечисления)
- Используется при хранении наборов перечислений
Алгоритмическое сравнение
{.ezlazyload}
Заключение
Фреймворк Java Collections - это фундаментальный фреймворк, который должен знать каждый Java-разработчик.
В этой статье мы говорили об интерфейсе Set и его реализациях, их преимуществах и недостатках, а также об операциях, которые вы наверняка будете использовать в тот или иной момент.
Если вам интересно узнать больше об интерфейсах коллекций, продолжайте читать - Коллекции Java: очереди, Deques и Stacks ( скоро ).