Коллекции в Java
В этом уроке мы рассмотрим коллекции, которые являются одной из важных частей Java Core.
Коллекции (Collection Framework) – это хранилища, поддерживающие различные способы накопления и упорядочения объектов с целью обеспечения возможностей эффективного доступа к ним. Они очень похожи на массивы, но имеют намного больше возможностей. Очень тяжело написать приложение на Java, которое может обойтись без коллекций.
Коллекции были добавлены в версии J2SЕ 1.2.
Collection framework в языке Java состоит из 3-х частей:
- интерфейсы,
- классы,
- алгоритмы.
Практически все коллекции и интерфейсы являются обобщенными. На этапе создания коллекции, вы скорее всего будете знать элементы какого типа вам нужны — String, Integer и т.д. Конечно же можно создать необобщенную коллекцию, но так делается крайне редко.
В этом уроке рассмотрим основные элементы коллекций, иерархия которых представлена на следующем рисунке:
Презентацию с видео можно скачать на Patreon .
- Интерфейс Collection
- Структуры данных
- Интерфейс List и класс ArrayList
- Интерфейс Set и классы HashSet, LinkedHashSet
- Интерфейс SortedSet и класс TreeSet
- Интерфейсы Comparable и Comparator
- Интерфейс NavigableSet
- Интерфейс Queue и классы
- Интерфейс Iterator
- Интерфейс ListIterator
- Отображения Map
- Класс Collections
- Backed Collections
- Legacy Classes
- Задания
Коллекции
Для хранения наборов данных в Java предназначены массивы. Однако их не всегда удобно использовать, прежде всего потому, что они имеют фиксированную длину. Эту проблему в Java решают коллекции. Однако суть не только в гибких по размеру наборах объектов, но в и том, что классы коллекций реализуют различные алгоритмы и структуры данных, например, такие как стек, очередь, дерево и ряд других.
Классы коллекций располагаются в пакете java.util , поэтому перед применением коллекций следует подключить данный пакет.
Хотя в Java существует множество коллекций, но все они образуют стройную и логичную систему. Во-первых, в основе всех коллекций лежит применение того или иного интерфейса, который определяет базовый функционал. Среди этих интерфейсов можно выделить следующие:
- Collection : базовый интерфейс для всех коллекций и других интерфейсов коллекций
- Queue : наследует интерфейс Collection и представляет функционал для структур данных в виде очереди
- Deque : наследует интерфейс Queue и представляет функционал для двунаправленных очередей
- List : наследует интерфейс Collection и представляет функциональность простых списков
- Set : также расширяет интерфейс Collection и используется для хранения множеств уникальных объектов
- SortedSet : расширяет интерфейс Set для создания сортированных коллекций
- NavigableSet : расширяет интерфейс SortedSet для создания коллекций, в которых можно осуществлять поиск по соответствию
- Map : предназначен для созданий структур данных в виде словаря, где каждый элемент имеет определенный ключ и значение. В отличие от других интерфейсов коллекций не наследуется от интерфейса Collection
Эти интерфейсы частично реализуются абстрактными классами:
- AbstractCollection : базовый абстрактный класс для других коллекций, который применяет интерфейс Collection
- AbstractList : расширяет класс AbstractCollection и применяет интерфейс List, предназначен для создания коллекций в виде списков
- AbstractSet : расширяет класс AbstractCollection и применяет интерфейс Set для создания коллекций в виде множеств
- AbstractQueue : расширяет класс AbstractCollection и применяет интерфейс Queue, предназначен для создания коллекций в виде очередей и стеков
- AbstractSequentialList : также расширяет класс AbstractList и реализует интерфейс List. Используется для создания связанных списков
- AbstractMap : применяет интерфейс Map, предназначен для создания наборов по типу словаря с объектами в виде пары «ключ-значение»
С помощью применения вышеописанных интерфейсов и абстрактных классов в Java реализуется широкая палитра классов коллекций — списки, множества, очереди, отображения и другие, среди которых можно выделить следующие:
- ArrayList : простой список объектов
- LinkedList : представляет связанный список
- ArrayDeque : класс двунаправленной очереди, в которой мы можем произвести вставку и удаление как в начале коллекции, так и в ее конце
- HashSet : набор объектов или хеш-множество, где каждый элемент имеет ключ — уникальный хеш-код
- TreeSet : набор отсортированных объектов в виде дерева
- LinkedHashSet : связанное хеш-множество
- PriorityQueue : очередь приоритетов
- HashMap : структура данных в виде словаря, в котором каждый объект имеет уникальный ключ и некоторое значение
- TreeMap : структура данных в виде дерева, где каждый элемент имеет уникальный ключ и некоторое значение
Схематично всю систему коллекций вкратце можно представить следующим образом:
Интерфейс Collection
Интерфейс Collection является базовым для всех коллекций, определяя основной функционал:
public interface Collection extends Iterable < // определения методов >
Интерфейс Collection является обобщенным и расширяет интерфейс Iterable, поэтому все объекты коллекций можно перебирать в цикле по типу for-each .
Среди методов интерфейса Collection можно выделить следующие:
- boolean add (E item) : добавляет в коллекцию объект item. При удачном добавлении возвращает true, при неудачном — false
- boolean addAll (Collection col) : добавляет в коллекцию все элементы из коллекции col. При удачном добавлении возвращает true, при неудачном — false
- void clear () : удаляет все элементы из коллекции
- boolean contains (Object item) : возвращает true, если объект item содержится в коллекции, иначе возвращает false
- boolean isEmpty () : возвращает true, если коллекция пуста, иначе возвращает false
- Iterator iterator () : возвращает объект Iterator для обхода элементов коллекции
- boolean remove (Object item) : возвращает true, если объект item удачно удален из коллекции, иначе возвращается false
- boolean removeAll (Collection col) : удаляет все объекты коллекции col из текущей коллекции. Если текущая коллекция изменилась, возвращает true, иначе возвращается false
- boolean retainAll (Collection col) : удаляет все объекты из текущей коллекции, кроме тех, которые содержатся в коллекции col. Если текущая коллекция после удаления изменилась, возвращает true, иначе возвращается false
- int size () : возвращает число элементов в коллекции
- Object[] toArray () : возвращает массив, содержащий все элементы коллекции
Все эти и остальные методы, которые имеются в интерфейсе Collection, реализуются всеми коллекциями, поэтому в целом общие принципы работы с коллекциями будут одни и те же. Единообразный интерфейс упрощает понимание и работу с различными типами коллекций. Так, добавление элемента будет производиться с помощью метода add , который принимает добавляемый элемент в качестве параметра. Для удаления вызывается метод remove() . Метод clear будет очищать коллекцию, а метод size возвращать количество элементов в коллекции.
#9 – Коллекции в Джава (Collections Framework)
Коллекции в Джава представляют из себя связку из нескольких классов, что дают возможность для создания структур данных. За урок мы научимся использовать классы ArrayList и LinkedList для создания динамических массивов данных.
Видеоурок
В языке Java можно создавать как простые массивы данных, так и динамические массивы данных, что также называются коллекциями. Работа с простыми типами массивов была рассмотрена в курсе по основам языка Java. Посмотреть соответсвующий урок можно здесь .
Коллекции в языке Java
Стандартные массивы предоставляют лишь небольшой функционал по работе с элементами. Если мы захотим добавить 10 элемент в массив что состоит из 9 элементов, то будет выдана ошибка. Такой подход совсем неудобен, ведь не позволяет динамично управлять данными в массиве.
На помощь приходят коллекции данных. В языке Java есть множество интерфейсов по работе с коллекциями. Все такие интерфейсы представлены ниже:
Как видно из фото, каждая коллекция представляет из себя именно интерфейс, а не класс. Основным интерфейсом является Collection.
Вы можете создать коллекцию (другими словами: массив данных) на основе Collection или же на основе других интерфейсов, что являются наследниками интерфейса Collection.
Пугаться коллекций не стоит, ведь коллекции это лишь интерфейсы, а они в свою очередь лишь набор функций, которыми мы, разработчики, можем пользоваться.
Основные коллекции
Помимо главного интерфейса Collection есть три других главных формата:
- List — коллекция для создания массивов данных, где индексами являются числа (0, 1, 2 и так далее);
- Set — тоже самое что List, вот только в Set нельзя установить повторяющиеся элементы;
- Map — коллекция для создания массивов данных, где индексами являются ключи («one», «2», «three» и так далее).
У каждого интерфейса есть интерфейсы наследники, что дополняют функциями базовый интерфейс. К примеру, можно создать коллекцию на основе класса List, а можно расширить её функционал за счёт создания коллекции на основе LinkedList.
Создание коллекций на основе разных интерфейсов очень схоже, поэтому в видео уроке были рассмотрены лишь ArrayList и LinkedList.
Коллекции безусловно удобнее чем массивы данных. Тем не менее, не стоит злоупотреблять ими, так как они занимают больше оперативной памяти, что может повлиять на скорость загрузки приложения в целом.
Работа с коллекциями
Для работы с коллекциями необходимо подключить соответсвующие интерфейсы из java.util .
При создании коллекции необходимо указать тип данных, имя, а также выделение памяти:
ArrayList numbers = new ArrayList<>(1); LinkedList names = new LinkedList<>();
Для работы с элементами существует множество методов. Наиболее часто используемые представлены ниже:
- add() — добавление элемента в конец массива;
- remove() — удаление элемента из массива по его индексу;
- clear() — очистка всего массива;
- size() — получение размера массива (количество элементов);
- addFirst() — добавление элемента в начало массива;
- addLast() — добавление элемента в конец;
- clone() — выполняет клонирование массива;
- get() — возвращает элемент по индексу;
- getFirst() — возвращает первый элемент в массиве;
- getLast() — возвращает последний элемент в массиве;
- set(index, element) — меняет значение элемента по индексу.
Весь код будет доступен после подписки на проект!
Коллекции в Java: что это такое и зачем они нужны
В пакете java.util содержится библиотека коллекций(collection framework), которая предоставляет большие возможности для работы с множествами, хэш-таблицами, векторами, разными видами списков и т.д.
Коллекция — это объект, способный хранить группу одинаковых элементов. Она содержит методы для операций с однородными данными. Изначально Java поддерживала работу с коллекциями в рамках классов Vector и Hashtable, но с появлением JDK 1.2 возможности работы с коллекциями были расширены, возникло много открытых интерфейсов и различных видов классов, которые были включены в библиотеку коллекций.
Основные преимущества классов collection framework(перед классами, разрабатываемыми самостоятельно) заключаются в следующем:
- ускоряется процесс разработки и улучшается качество кода;
- обеспечивается поддержка повторного использования кода;
- производится стандартизация интерфейса ваших классов;
- реализуется поддержка многопоточного доступа.
Проверке готовых классов-коллекций уделялось много внимания, поэтому правомерно говорить об улучшении качества кода. Данные классы можно считать хорошо отлаженными с минимальным количеством ошибок, что зачастую невозможно обеспечить в самостоятельных проектах.
Основу библиотеки составляют открытые интерфейсы, которые можно использовать для создания собственных коллекций. Каждый интерфейс объявляет набор методов, которые вы обязаны реализовать в своей программе:
- Collection — группа элементов(охватывает Set и List);
- Set — множество элементов(без дублирования);
- SortedSet — то же самое, что Set, только элементы упорядочены;
- List — упорядоченный список;
- Map — словарь, то есть коллекция, в которой каждый элемент имеет уникальный ключ;
- SortedMap — то же самое, что и Map, однако элементы упорядочены;
- Queue — интерфейс для работы с очередью.
Разумеется, интерфейсы были бы «пустыми», если бы в них не существовало встроенных классов, реализующих необходимые функций:
- ArrayList — список List как массив элементов;
- LinkedList — список List, выполняющий функции связанного списка;
- HashSet — множество Set как хэш-таблица;
- TreeSet — множество SortedSet, используемое как дерево;
- HashMap — индексированный словарь хэш;
- TreeMap — коллекция SortedMap древовидной структуры.
Задача каждого из интерфейсов — обеспечить простоту и удобство работы с большим количеством однотипных данных. Рассмотрим подробнее назначение каждого из этих интерфейсов.
- Collection — общий интерфейс, объединяющий интерфейсы Set и List. Содержит методы для добавления и удаления элементов коллекции, проверки их правильности, наличия и другие.
- Set — неупорядоченный набор неповторяющихся элементов. Расширяет интерфейс Collection. Если производится попытка добавить в набор элемент, который уже в нем содержится, она будет проигнорирована.
- List — служит для работы с упорядоченными коллекциями. К каждому элементы такой коллекции можно обратиться по индексу. Расширяет интерфейс Collection.
- Map — предназначен для работы с коллекциями-словарями, в которых содержатся ключи и соответствующие им значения(каждому ключу соответствует только одно значением). Словарь может содержать произвольное число элементов.
- Queue — содержит методы для работы с очередями: в них элементы добавляются с одного конца, а извлекаются с другого.