Вступление
Фреймворк Java Collections – это фундаментальная и необходимая структура, которую любой сильный разработчик Java должен знать как свои пять пальцев.
Коллекция в Java определяется как группа или коллекция отдельных объектов, которые действуют как единый объект.
В Java существует множество классов коллекций , и все они расширяют java.util.Коллекция и java.util.Карта Интерфейсы. Эти классы в основном предлагают различные способы формирования коллекции объектов внутри одного объекта.
Коллекции Java – это платформа, которая обеспечивает множество операций над коллекцией – поиск, сортировку, вставку, манипулирование, удаление и т.д.
Это первая часть серии статей о коллекциях Java:
- Интерфейс Списка
- Установленный интерфейс ( вы находитесь здесь )
- Интерфейс Карты
- Интерфейсы очереди и Deque
Наборы
Следующий общий интерфейс из фреймворка – java.util.Установить .
Наборы не предлагают дополнительных методов, кроме методов, унаследованных от интерфейса Collection .
Набор моделирует абстракцию математического набора и не может содержать повторяющиеся элементы. Тем не менее, также стоит отметить, что эти элементы не имеют определенного порядка в наборе:
Listnames = Arrays.asList("David", "Scott", "Adam", "Jane", "Scott", "David", "Usman"); System.out.println(names); Set uniqueNames = new HashSet<>(names); System.out.println(uniqueNames);
Запуск этого фрагмента кода приведет к:
[David, Scott, Adam, Jane, Scott, David, Usman] [Adam, David, Jane, Scott, Usman]
Как вы можете заметить, список имена содержит дубликаты записей, а набор уникальные имена удаляет дубликаты и распечатывает их без определенного порядка.
Добавление элемента
Используя метод add () , аналогично спискам, мы можем добавлять объекты в набор:
SetuniqueNames = 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() для удаления всех элементов набора:
Listnames = Arrays.asList("David", "Scott", "Adam", "Jane", "Scott", "David", "Usman"); Set uniqueNames = new HashSet<>(names); uniqueNames.clear(); System.out.println(uniqueNames);
Запуск этого фрагмента кода приведет к:
[]
В качестве альтернативы мы могли бы положиться на метод removal() :
Listnames = Arrays.asList("David", "Scott", "Adam", "Jane", "Scott", "David", "Usman"); List newNames = Arrays.asList("David", "Adam"); Set uniqueNames = new HashSet<>(names); uniqueNames.removeAll(newNames); System.out.println(uniqueNames);
Запуск этого фрагмента кода приведет к:
[Jane, Scott, Usman]
Важно отметить, что метод removeAll() принимает Коллекцию в качестве аргумента. Это можно использовать для удаления всех общих элементов из двух разных коллекций, в данном случае a List и a Set .
Git Essentials
Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!
Также имейте в виду, что вы можете использовать этот метод для удаления всех элементов из самой коллекции :
uniqueName.removeAll(uniqueNames);
Это, конечно, приведет к пустому набору. Однако этот подход не рекомендуется, так как вызов метода removeAll() стоит намного дороже, чем метод clear () .
Это связано с тем, что метод removeAll() сравнивает каждый отдельный элемент из коллекции аргументов с коллекцией, которая вызывает метод, тогда как clear() просто указывает их все на null и устанавливает размер равным 0.
Содержит элемент
Используя логический метод contains() с данным объектом, мы можем проверить, содержит ли этот Набор указанный элемент:
Listnames = Arrays.asList("David", "Scott", "Adam", "Jane", "Scott", "David", "Usman"); Set 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
Повторяющиеся Элементы
То же самое, что и со списками, хотя возможна итерация с для и расширенными циклами для , для этой задачи лучше использовать Итератор коллекций Java:
Setset = new TreeSet (); ... for(Iterator iterator = set.iterator(); iterator.hasNext()) { E element = iterator.next(); element.someMethod(); iterator.remove(element); }
Кроме того, Java 8 знакомит нас с действительно простым способом печати элементов с использованием ссылок на методы:
set.forEach(System.out::println);
Получение Размера
Если вы хотите получить размер набора:
Listnames = Arrays.asList("David", "Scott", "Adam", "Jane", "Scott", "David", "Usman"); Set uniqueNames = new HashSet<>(names); System.out.println(uniqueNames.size());
Запуск этого фрагмента кода приведет к:
5
Проверка, Пусто ли
Если вы хотите проверить, является ли набор пустым или нет, прежде чем выполнять с ним какие-либо операции:
Listnames = Arrays.asList("David", "Scott", "Adam", "Jane", "Scott", "David", "Usman"); Set uniqueNames = new HashSet<>(names); System.out.println(uniqueNames.isEmpty());
Запуск этого фрагмента кода приведет к:
false
Реализации и различия
Хэш-набор :
- На основе
HashMap(Вызывает hashCode() на элементе и ищет местоположение) - Хорошая реализация общего назначения (изменяет размер, когда заканчивается место)
Набор деревьев :
- На основе
Карты деревьев(Использует двоичное дерево с требуемым порядком сортировки) - Сохраняет элементы в заданном порядке
Перечисление :
- Специализированная реализация для перечислений (использует набор битов, основанный на порядковом номере перечисления)
- Используйте при хранении наборов перечислений
Алгоритмическое Сравнение
Вывод
Фреймворк Java Collections – это фундаментальный фреймворк, который каждый разработчик Java должен знать, как использовать.
В этой статье мы обсудили интерфейс набора и его реализации, их преимущества и недостатки, а также операции, которые вы, безусловно, будете использовать в тот или иной момент.
Если вам интересно узнать больше об интерфейсах коллекций, продолжайте чтение – Коллекции Java: очереди, деки и стеки ( скоро ).