Рубрики
Без рубрики

Коллекции Java: Установленный Интерфейс

Автор оригинала: Vuk Skobalj.

Вступление

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

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

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

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

Это первая часть серии статей о коллекциях Java:

  • Интерфейс Списка
  • Установленный интерфейс ( вы находитесь здесь )
  • Интерфейс Карты
  • Интерфейсы очереди и Deque

Наборы

Следующий общий интерфейс из фреймворка – java.util.Установить .

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

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

List names = 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 () , аналогично спискам, мы можем добавлять объекты в набор:

Set 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() для удаления всех элементов набора:

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

uniqueNames.clear();
System.out.println(uniqueNames);

Запуск этого фрагмента кода приведет к:

[]

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

List names = 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() с данным объектом, мы можем проверить, содержит ли этот Набор указанный элемент:

List names = 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:

Set set = 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);

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

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

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

System.out.println(uniqueNames.size());

Запуск этого фрагмента кода приведет к:

5

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

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

List names = 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: очереди, деки и стеки ( скоро ).