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

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

Открыта

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

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

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

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

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

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

Интерфейсы коллекций - 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 можно, но не рекомендуется.

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

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

Комментарии (40)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
SomeBody098веник в бане
1 ноября 2024, 06:15
Методы интерфейса Set<E>: нет методов
li.ch
Уровень 41
Expert
6 июня 2023, 09:56
А какую коллекцию рекомендуется использовать вместо стека?
Нейросеть
Уровень 41
1 августа 2023, 12:55
В описании стека авторы сами написали: " 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, 03:46
Если HashSet реализует интерфейс Set, а LinkedHashSet наследуется от HashSet, то зачем дополнительная реализация интерфейса Set? Или это просто схематично отображено, чтобы было сразу понятно?
Kurama
Уровень 50
22 марта 2023, 19:03
Та вся эта схема немного через одно место сделана
Dolivo Serg
Уровень 40
16 августа 2022, 07:57
Первое что бросается в глаза на картинке - нет стрелочки от ArrayList с наследованием AbstractList
Макс Дудин
Уровень 41
4 мая 2022, 08:38
вот так понятней... boolean retainAll(Collection<?> c) Сохраняет в этой коллекции только те элементы, которые содержатся в указанной коллекции (дополнительная операция).Другими словами, удаляет из этой коллекции все ее элементы, не содержащиеся в указанной коллекции.
Aleksey
Уровень 51
16 ноября 2021, 09:11
Ну вообще-то TreeSet наследуется от AbstractSet https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/TreeSet.html
Ян
Уровень 41
22 ноября 2021, 20:28
точно так же как и ArrayList<E> наследуется от AbstractList<E>: https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html
Stepan
Уровень 27
20 марта 2022, 18:50
и AbstractSet реализует Set https://docs.oracle.com/javase/7/docs/api/java/util/AbstractSet.html
Aleksey
Уровень 51
21 марта 2022, 07:08
если разобраться, то схема будет совсем другая
Valua Sinicyn
Уровень 41
16 февраля 2021, 07:14
Спасибо за инфо-графику, забрал.
Vladyslav Pelykh
Уровень 41
25 октября 2021, 18:14
++ В Шилдте все описывалось, ко именно инфо-графики не хватало...
Vorlock
Уровень 31
29 января 2020, 17:50
"Но давай продолжим изучат интерфейсы:" - что-то новое в орфографии (выделил жирным)
Сергей
Уровень 1
21 апреля 2022, 11:16
Всё ещё исправляют.
Vorlock
Уровень 31
29 января 2020, 17:46
не, похоже дальтоник кто фронт писал\верстал
wrcraid
Уровень 35
13 декабря 2019, 07:21
"Во-вторых, красные стрелочки обозначают «наследуется от»." - похоже я дальтоник (