— Привет, Амиго!
— Привет, Элли!
— Сегодня мы разберемся с устройством коллекций раз и навсегда.
— Давно этого ждал.
— Ты уже знаешь, что такое коллекции, и знаешь, как с ними работать. Пришло время выстроить твои знания в строгую систему. Тогда отпадут многие вопросы — почему, как, зачем — и большинство вещей станет очевидно.
Интерфейсы коллекций. Структура наследования интерфейсов коллекций выглядит примерно так:
Обрати внимание, на две вещи.
Во-первых, все, что ты тут видишь – это интерфейсы.
Во-вторых, стрелочки обозначают «наследуется от».
— Т.е. 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.
— Давай.
— Тогда держи:
— Ничего себе, да она просто огромная!
— Ну, не такая уж она и большая. Кроме того, запоминать абстрактные классы совсем не обязательно. А вот какой класс, какие интерфейсы реализует лучше запомнить – такое может пригодиться довольно часто.
— Ну, еще хотелось бы отметить, что некоторые коллекции были признаны устаревшими.
— Это какие же?
— Это я про классы Vector, Stack, Dictionary, Hashtable – они являются синхронизированными (потокобезопасными) версиями обычных коллекций.
Но в Java появилась специальная библиотека — concurrency, где содержится очень много коллекций, к которым не только можно обращаться из других потоков/нитей, но и которые написаны гораздо эффективнее. ConcurrentHashMap гораздо эффективнее Hashtable.
Использовать коллекции Vector, Stack, Dictionary, Hashtable можно, но не рекомендуется.
— Ясно, буду иметь в виду.
Спасибо, Элли!
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ