Тема 15. Java Collection Framework - BelyiZ/JavaCourses GitHub Wiki

Содержание:

  1. Обзор Collections Framework
  2. Iterator
  3. Список литературы/курсов

Большая часть работы кода — это обработка данных в том или ином виде. Обработать массив данных, структурировать, найти соответствие между данными, отфильтровать, а если перейти к примерам, то получить список пользователей, получить список адресов, как-то их отсортировать, выполнить поиск в данных, сопоставить данные. Именно поэтому знание коллекций считается одним из основных навыков.

Обзор Collections Framework

Это набор различных интерфейсов и инструментов для работы с массивами данных в различных форматах. Коллекции позволяют производить манипуляции с массивами (Array), очередями (Queue), стеками (Stack), списками (List), справочниками (Map), множествами (Set) и другими структурами.

Collection — это идея, это представление о том, как должны себя вести все коллекции.

В основе иерархической структуры Java Collections Framework лежит интерфейс Collection. Этот интерфейс содержит в себе основные методы, необходимые для работы с массивами данных, такие как:

  • add(…) — добавить.
  • remove(…) — убрать.
  • clear(…) — очистить.

Остальные интерфейсы и классы так или иначе наследуются от него. Прямые наследники интерфейса Collection - базовые интерфейсы для основных типов структур данных:

  • List - линейные списки данных.
  • Queue - очереди данных.
  • Set - множества уникальных объектов.

Отдельно располагается интерфейс Map, который задает методы для работы с парами ключ-значение. Он не наследуется от Collection, потому что требует совершенно другого подхода к работе с данными.

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

Java Collection Framework hierarchy

Интерфейс Collection имеет абстрактный класс AbstractCollection, то есть некоторая "абстрактная коллекция", которая представляет собой скелет для остальных реализаций. Говоря о массивах данных, напрашивается вопрос об итерировании - поочередном переборе каждого элемента массива. Для реализации такой функциональности интерфейс Collection наследуется от интерфейса Iterable, который был создан как раз для таких целей. Это значит, что все наследники интерфейса Collection являются итерируемыми вне зависимости от типа их реализации. И именно при помощи итератора в AbstractCollection реализованы такие фундаментальные методы, как contains, toArray, remove.

Фундаментальные методы AbstractCollection:

  • contains
  • toArray
  • remove

Iterator

Во время разработки приложений часто возникает задача получить доступ ко всем элементами коллекции. Например, вывести на экран эти элементы.

Самым простым и эффективным способом сделать это, является использование итератора iterator.

В Java итератор-это интерфейс, доступный в среде сбора данных в пакете java.util и реализующий интерфейсы Iterator, либо ListIterator. Это курсор Java, используемый для перебора набора объектов.

Зачем нужен итератор (преимущества использования):

  • Он используется для обхода элементов объекта коллекции один за другим.
  • Он применим для любого класса Collection.
  • Он поддерживает как операции чтения, так и операции удаления.
  • Если вы используете цикл for, вы не можете обновить (добавить / удалить) коллекцию, тогда как с помощью итератора вы можете легко обновить коллекцию.
  • Универсальный для API коллекции.
  • Имена методов очень просты в использовании.

То есть

Iterator позволяет нам получить доступ ко всем элементам коллекции и удалять те из них, которые необходимо. ListIterator является наследником Iterator и позволяет нам “пробежаться” по коллекции в обоих направлениях. ListIterator также позволяет нам изменять элементы.

Итератор имеет следующие методы:

boolean hasNext() - проверяет, есть ли в коллекции следующий элемент. Если есть, то метод возвращает true, если нет – false. Object next() - возвращает следующий элемент коллекции. Если элемент не обнаружен, то метод “бросает” NoSuchElementException. void remove()- удаляет текущий элемент. Важный момент заключается в том, что сначала этот элемент необходимо получить с помощью метода next(), если мы вызовем метод remove() до метода next(), то мы получим IllegalStateException.

ListIterator имеет больший набор методов. О них вохможно прочитать в материалах из списка литературы.

Пример:

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

public class FootballIterator
{
public static void main(String[] args)
{
    List playernames = new LinkedList<>();
    names.add("Рукамячев");
    names.add("Корзинамячев");
    names.add("Звездный");

	// Создание Iterator
	Iterator playerIterator = playernames.iterator();
    
	// Проходим элесенты
	while(playernamesIterator.hasNext()){
        System.out.println(playernamesIterator.next());
    }	

}
}

Создался объект итератора извне и были извлечены элементы объекта списка один за другим.

Ограничения итератора Java:

В операциях CRUD он НЕ поддерживает операции создания и обновления. Он поддерживает только итерацию прямого направления, которая является однонаправленным итератором. По сравнению с Spliterator, он НЕ поддерживает параллельное повторение элементов, что означает, что он поддерживает только последовательную итерацию. По сравнению с Spliterator, он НЕ поддерживает лучшую производительность для итерации большого объема данных. Чтобы преодолеть эти ограничения, Java представила еще два курсора: ListIterator и Spliterator.

Список литературы/курсов

  1. https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html
  2. https://proselyte.net/tutorials/java-core/collections-framework/iterator/
  3. https://java-blog.ru/osnovy/iterator-java

Тема 14. Java Code Convention | Оглавление | Тема 16. Списки