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

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

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

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

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

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

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

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

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

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

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

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

— Давай.

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

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

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

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

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

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

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

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

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

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

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