JavaRush /Курсы /Java Collections /Интерфейсы коллекций

Интерфейсы коллекций

Java Collections
6 уровень , 3 лекция
Открыта

— Привет, Амиго!

— Привет, Элли!

— Сегодня мы разберемся с устройством коллекций раз и навсегда.

— Давно этого ждал.

— Ты уже знаешь, что такое коллекции, и знаешь, как с ними работать. Пришло время выстроить твои знания в строгую систему. Тогда отпадут многие вопросы — почему, как, зачем — и большинство вещей станет очевидно.

Интерфейсы коллекций. Структура наследования интерфейсов коллекций выглядит примерно так:

Интерфейсы коллекций - 1

Обрати внимание, на две вещи.

Во-первых, все, что ты тут видишь – это интерфейсы.

Во-вторых, стрелочки обозначают «наследуется от».

— Т.е. List, Set, Queue наследуются от Collection, а Map – нет?

— Ага. Потом от этих интерфейсов наследуются абстрактные классы, а от них в свою очередь – известные тебе реализации: ArrayList, Hashtable, TreeSet,…

— Есть такое дело.

Теперь давай посмотрим, что за методы есть у этих интерфейсов:

Методы интерфейса Iterable<E>:

Методы Описание
Iterator<T> iterator(); Возвращает объект-итератор.

— Маловато как-то.

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

Методы интерфейса Collection<E>:

Методы Описание
boolean add(E e); Добавляет элемент в коллекцию
boolean addAll(Collection<? extends E> c); Добавляет элементы в коллекцию
void clear(); Удаляет все элементы из коллекции
boolean contains(Object o); Проверяет – есть ли в коллекции элемент?
boolean containsAll(Collection<?> c); Проверяет – есть ли в коллекции элементы?
boolean equals(Object o); Сравнивает коллекции
int hashCode(); Возвращает хэш-код
boolean isEmpty(); Проверяет – пуста ли коллекция?
Iterator<E> iterator(); Возвращает объект-итератор
boolean remove(Object o); Удаляет элемент из коллекции
boolean removeAll(Collection<?> c); Удаляет элементы из коллекции
boolean retainAll(Collection<?> c); Удаляет все элементы, которых нет «с»
int size(); Возвращает размер коллекции
Object[] toArray(); Преобразовывает коллекцию к массиву
<T> T[] toArray(T[] a); Преобразовывает коллекцию к массиву

— Тут уже посолиднее все. Половину из этих методов я использовал, а со второй сталкивался.

— Отлично, тогда продолжим.

Методы интерфейса List<E>:

Методы Описание
void add(int index, E element); Добавляет элементы в середину коллекции
boolean addAll(int index, Collection<? extends E> c); Добавляет элементы в коллекцию
E get(int index); Возвращает элемент по номеру
int indexOf(Object o); Возвращает индекс(номер) элемента
int lastIndexOf(Object o); Возвращает последний индекс элемента.
ListIterator<E> listIterator(); Возвращает итератор для списка
ListIterator<E> listIterator(int index); Возвращает итератор для списка
E remove(int index); Удаляет элемент по индексу
E set(int index, E element); Устанавливает новое значение по индексу
List<E> subList(int fromIndex, int toIndex); Возвращает подколлекцию

— Тоже ничего кардинально нового. Я уже практически все знаю по коллекциям, что не может не радовать.

— Ну, я думаю, у меня найдется, чем тебя удивить. Но давай продолжим изучат интерфейсы:

Методы интерфейса Set<E>:

Методы Описание
нет методов

Интерфейс Set не содержит новых методов, только унаследованные.

— Да, я смотрю, интерфейс Iterable был еще ничего.

С другой стороны – меньше методов – меньше запоминать!

— Меня радует твой жизнеутверждающий оптимизм.

У интерфейса Set есть два интерфейса-наследника с методами: SortedSet и NavigableSet, но я не буду их приводить, а то мы никогда не закончим.

Давай я лучше дам тебе общую картину классов и интерфейсов, описывающих коллекции в Java.

— Давай.

— Тогда держи:

Интерфейсы коллекций - 2

— Ничего себе, да она просто огромная!

— Ну, не такая уж она и большая. Кроме того, запоминать абстрактные классы совсем не обязательно. А вот какой класс, какие интерфейсы реализует лучше запомнить – такое может пригодиться довольно часто.

— Ну, еще хотелось бы отметить, что некоторые коллекции были признаны устаревшими.

— Это какие же?

— Это я про классы Vector, Stack, Dictionary, Hashtable – они являются синхронизированными (потокобезопасными) версиями обычных коллекций.

Но в Java появилась специальная библиотека — concurrency, где содержится очень много коллекций, к которым не только можно обращаться из других потоков/нитей, но и которые написаны гораздо эффективнее. ConcurrentHashMap гораздо эффективнее Hashtable.

Использовать коллекции Vector, Stack, Dictionary, Hashtable можно, но не рекомендуется.

— Ясно, буду иметь в виду.

Спасибо, Элли!

Комментарии (41)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
SomeBody098 Уровень 51
1 ноября 2024
Методы интерфейса Set<E>: нет методов
li.ch Уровень 41 Expert
6 июня 2023
А какую коллекцию рекомендуется использовать вместо стека?
Нейросеть Уровень 41
1 августа 2023
В описании стека авторы сами написали: " A more complete and consistent set of LIFO stack operations is provided by the Deque interface and its implementations, which should be used in preference to this class. For example: Deque<Integer> stack = new ArrayDeque<Integer>(); "
pichitap Уровень 51
24 февраля 2023
Если HashSet реализует интерфейс Set, а LinkedHashSet наследуется от HashSet, то зачем дополнительная реализация интерфейса Set? Или это просто схематично отображено, чтобы было сразу понятно?
Kurama Уровень 50
22 марта 2023
Та вся эта схема немного через одно место сделана
Dolivo Serg Уровень 40
16 августа 2022
Первое что бросается в глаза на картинке - нет стрелочки от ArrayList с наследованием AbstractList
Макс Дудин Уровень 41
4 мая 2022
вот так понятней... boolean retainAll(Collection<?> c) Сохраняет в этой коллекции только те элементы, которые содержатся в указанной коллекции (дополнительная операция).Другими словами, удаляет из этой коллекции все ее элементы, не содержащиеся в указанной коллекции.
Aleksey Уровень 51
16 ноября 2021
Ну вообще-то TreeSet наследуется от AbstractSet https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/TreeSet.html
Ян Уровень 41
22 ноября 2021
точно так же как и ArrayList<E> наследуется от AbstractList<E>: https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html
Stepan Уровень 27
20 марта 2022
и AbstractSet реализует Set https://docs.oracle.com/javase/7/docs/api/java/util/AbstractSet.html
Aleksey Уровень 51
21 марта 2022
если разобраться, то схема будет совсем другая
Valua Sinicyn Уровень 41
16 февраля 2021
Спасибо за инфо-графику, забрал.
Vladyslav Pelykh Уровень 41
25 октября 2021
++ В Шилдте все описывалось, ко именно инфо-графики не хватало...
Vorlock Уровень 31
29 января 2020
"Но давай продолжим изучат интерфейсы:" - что-то новое в орфографии (выделил жирным)
Сергей Уровень 41
21 апреля 2022
Всё ещё исправляют.
Vorlock Уровень 31
29 января 2020
не, похоже дальтоник кто фронт писал\верстал
wrcraid Уровень 35
13 декабря 2019
"Во-вторых, красные стрелочки обозначают «наследуется от»." - похоже я дальтоник (