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

— Привіт, Еллі!

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

— Давно на це чекав.

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

Інтерфейси колекцій. Структура успадкування інтерфейсів колекцій виглядає приблизно так:

Інтерфейси колекцій - 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 можна, але не рекомендується.

— Зрозуміло, матиму на увазі.

Дякую, Еллі!