— Привіт, Аміго!
— Привіт, Еллі!
— Сьогодні ми розберемося з влаштуванням колекцій раз і назавжди.
— Давно на це чекав.
— Ти вже знаєш, що таке колекції, і знаєш, як із ними працювати. Настав час вибудувати твої знання у сувору систему. Тоді відпадуть багато питань. чому, як, навіщо — і більшість речей стане очевидною.
Інтерфейси колекцій. Структура успадкування інтерфейсів колекцій виглядає приблизно так:
Зверни увагу на дві речі.
По-перше, все, що ти тут бачиш – це інтерфейси.
По-друге, стрілочки позначають «успадковується від».
— Тобто. 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 можна, але не рекомендується.
— Зрозуміло, матиму на увазі.
Дякую, Еллі!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ