Тема 15. Java Collection Framework - BelyiZ/JavaCourses GitHub Wiki
Содержание:
Большая часть работы кода — это обработка данных в том или ином виде. Обработать массив данных, структурировать, найти соответствие между данными, отфильтровать, а если перейти к примерам, то получить список пользователей, получить список адресов, как-то их отсортировать, выполнить поиск в данных, сопоставить данные. Именно поэтому знание коллекций считается одним из основных навыков.
Обзор Collections Framework
Это набор различных интерфейсов и инструментов для работы с массивами данных в различных форматах. Коллекции позволяют
производить манипуляции с массивами (Array
), очередями (Queue
), стеками (Stack
), списками (List
), справочниками (Map
),
множествами (Set
) и другими структурами.
Collection — это идея, это представление о том, как должны себя вести все коллекции.
В основе иерархической структуры Java Collections Framework лежит интерфейс
Collection
. Этот интерфейс содержит в себе основные методы, необходимые для работы с массивами данных, такие как:
add(…)
— добавить.remove(…)
— убрать.clear(…)
— очистить.
Остальные интерфейсы и классы так или иначе наследуются от него. Прямые наследники интерфейса Collection
- базовые
интерфейсы для основных типов структур данных:
List
- линейные списки данных.Queue
- очереди данных.Set
- множества уникальных объектов.
Отдельно располагается интерфейс Map
, который задает методы для работы с парами ключ-значение. Он не наследуется от
Collection
, потому что требует совершенно другого подхода к работе с данными.
Все эти интерфейсы описывают основную функциональность для каждой структуры, их стандартные реализации являются основными классами для работы с наборами данных в Java. Наглядно структуру можно изучить на схеме ниже:
Интерфейс 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.
Список литературы/курсов
- https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html
- https://proselyte.net/tutorials/java-core/collections-framework/iterator/
- https://java-blog.ru/osnovy/iterator-java
Тема 14. Java Code Convention | Оглавление | Тема 16. Списки