Колекції – це сховища, що підтримують різні способи накопичення та впорядкування об'єктів для забезпечення можливостей ефективного доступу до них.
Колекції є реалізацією абстрактних типів (структур) даних, що підтримують три основні операції:
• додавання нового елемента до колекції;
• видалення елемента з колекції;
• зміна елемента в колекції.
Колекції варто застосовувати, якщо:
• окремі елементи використовуються для однакових цілей та однаково важливі;
• на момент компіляції кількість елементів не відома чи не зафіксована; додавання нового елемента до колекції;
• потрібна підтримка операції перебору всіх елементів;
• необхідна підтримка упорядкування елементів.
В інтерфейсі Collection визначено методи, які працюють на всіх колекціях:
• boolean add (E obj) додає obj до викликаної колекції та повертає true, якщо об'єкт доданий, і false, якщо obj вже елемент колекції;
• boolean addAll (Collection c) додає всі елементи колекції до викликаної колекції;
• void clear() видаляє всі елементи колекції;
• boolean contains (Object obj) повертає true, якщо викликана колекція, містить елемент obj;
• boolean equals (Object obj) повертає true, якщо відповідні елементи колекції є еквівалентними;
• boolean isEmpty() повертає true, якщо колекція порожня;
• Iterator iterator () витягує ітератор;
• boolean remove (Object obj) видаляє obj із колекції;
• int size() – повертає кількість елементів у колекції;
• Object[ ] toArray () – копіює елементи колекції до масиву об'єктів;
• T[ ] toArray (T a[ ]) – копіює елементи колекції до масиву об'єктів певного типу.
Ітератор – інтерфейс, що надає доступ до елементів колекції (масиву або контейнера) та навігацію за ними.
Спеціальний ітератор ListIterator містить удосконалений ітератор ListIterator для обробки послідовних властивостей списку.
ListIterator дає змогу вставляти, замінювати елементи та проводити перебір елементів у двох напрямках.
Методи інтерфейсу Iterator<E> :
• boolean hasNext () перевіряє наявність наступного елемента, а за його відсутності(завершення колекції) повертає false. Водночас ітератор залишається незмінним;
• E next () пересуває ітератор і повертає відповідний об'єкт, на який вказує ітератор. Якщо наступний елемент колекції відсутній, метод next() генерує виняток NoSuchElementException;
• void remove () видаляє об'єкт, повернутий останнім викликом методу next().
Методи інтерфейсу ListIterator<E> :
• E previous (), int previousIndex (), boolean hasPrevious () забезпечує зворотну навігацію за списком;
• int nextIndex () повертає номер елемента, на якому перебуватиме ітератор після виклику методу next();
• void add (E obj) дає змогу вставляти елемент до списку поточної позиції;
• void set (E obj) здійснює заміну поточного елемента списку на об'єкт, що передається методом як параметр.
Карта зображень (MAP) – це об'єкт, який зберігає пару «ключ-значення».
• Пошук об’єкту (значення) полегшується в порівнянні з множинами завдяки тому, що його можна знайти за його унікальним ключем.
• Унікальність об'єктів-ключів має забезпечуватися перевизначенням методів hashCode() і equals() класом користувача.
• Якщо елемент із зазначеним ключем відсутній у карті, то повертається значення null.
В інтерфейсі Map є вкладений інтерфейс Map.Entry<K, V>, який містить такі методи:
• K getKey() повертає ключ поточної пари;
• V getValue() повертає значення поточної пари;
• V setValue (V obj) встановлює значення об'єкта obj у парі.
В інтерфейсі Comparable оголошено лише один метод – compareTo(Object obj). Він призначений реалізації впорядкування об'єктів класу. compareTo() зручно використовувати під час сортування впорядкованих списків чи масивів об'єктів.
Цей метод порівнює викликаний об'єкт з obj. На відміну від методу equals(), який повертає true або false, compareTo() повертає:
• 0, якщо значення рівні;
• негативне значення, якщо викликаний об'єкт менший за параметр;
• позитивне значення, якщо викликаний об'єкт більший за параметр.
В інтерфейсі Comparator оголошено два методи: compareTo (Object obj1, Object obj2) та equals (Object obj).
compareTo (Object obj1, Object obj2) так само як і метод compareTo інтерфейсу Comparable, упорядковує об'єкти класу.
Так само на виході отримує 0, позитивне значення і негативне значення.
Метод може викинути виняток ClassCastException, якщо типи об'єктів не сумісні під час порівняння.
Основною відмінністю інтерфейсу Comparator від Comparable є те, що можна створювати кілька різновидів незалежних сортувань.
List – впорядкована колекція, яка іноді називається списком або послідовністю.
• Список може містити елементи, що повторюються.
• Розробник має абсолютний контроль над тим, де списку буде вставлено кожен елемент.
• Користувач може отримати доступ до елементів списку за індексом.
Усі колекції реалізують інтерфейси Serializable, Cloneable (окрім WeakHashMap).
ArrayList – масив, що автоматично розширюється, може змінювати свій розмір у процесі виконання програми.
ArrayList list = new ArrayList();
Елементи ArrayList можуть бути будь-якого типу, але в одному списку можуть бути елементи тільки одного типу. Щоб явно вказати, якого типу елементи зберігатимуться у списку, необхідно під час створення списку явно вказати тип елементів, які у ньому зберігатимуться:
ArrayList<String> list = new ArrayList<String> ();
Такий запис означає, що ми використовували дженерик (узагальнення) з типізованими параметрами. У Java 7 з'явився укорочений (ромбоподібний) запис:
ArrayList<String> list = new ArrayList<> ();
Переваги ArrayList над Array
Вставлення та видалення елементів із середини масиву, щоб не залишалося дірок.
• Зміна розміру: коли потрібно записати у внутрішній масив ще один елемент, а вільного місця там немає, то всередині ArrayList:
- створюється ще один масив, у півтора раза більший за розмір внутрішнього масиву, плюс один елемент;
- усі елементи зі старого масиву копіюються новий масив;
- новий масив зберігається у внутрішній змінній об'єкта ArrayList, старий масив оголошується сміттям (ми просто перестаємо зберігати на нього посилання)
Методи класу ArrayList
add(E element) вставляє елемент element у кінець списку.
add(int index, E element) вставляє елемент element на позицію index.
remove(int index) видаляє елемент за певною позицією index.
remove(Object o) видаляє перший знайдений елемент, якщо він існує в списку. clear() видаляє усі елементи списку.
get(int index) повертає елемент, що розташований на позиції index.
set(int index, E element) заміщує елемент позиції index елементом
element. size() повертає кількість елементів у списку.
toArray() повертає масив, який містить усі елементи списку.
indexOf(Object o) повертає позицію елемента o у списку або -1, якщо елемента немає.
contains(Object o) повертає true якщо список містить елемент o.
Список LinkedList<E>
Клас LinkedList<E> реалізує інтерфейс Queue<E> та List<E>.
• Є представником двонапрямного списку, де кожен елемент структури містить покажчики на попередній і наступний елементи.
• Ітератор підтримує обхід в обидва боки.
• Реалізує методи отримання, видалення та вставки в початок, середину та кінець списку.
• Дає змогу додавати будь-які елементи, навіть null.
• Список може містити елементи, що повторюються.
Створення об'єкта:
List list = new LinkedList<>();
Methods of class LinkedList<E>
Для маніпуляцій з першим та останнім елементами списку в LinkedList<E> реалізовані методи:
• void addFirst(E ob), void addLast(E ob) додають елементи на початок і в кінець списку;
• E getFirst(), E getLast() – видобувні елементи;
• E removeFirst(), E removeLast() – усувальні та видобувні елементи;
• E removeLastOccurrence(E elem), E removeFirstOccurrence(E elem) – усувальні.
interface Queue <E>
Queue (читається кью) – черга. Колекція, яка призначена для зберігання елементів у порядку, необхідному для їхньої обробки. Черги зазвичай, але не обов'язково, упорядковують елементи у порядку FIFO (first-in-first-out, «першим увійшов – першим вийшов»).
PriorityQueue – єдина пряма реалізація інтерфейсу Queue (не беручи до уваги LinkedList, який більше є списком, ніж чергою). Ця черга впорядковує елементи або за їхнім натуральним порядком (використовуючи інтерфейс Comparable), або за допомогою інтерфейсу Comparator, отриманого в конструкторі.
Queue<E> q = new LinkedList<>(); PriorityQueue<E> pq = new PriorityQueue<>();
Методи интерфейсу Queue<E>
В інтерфейсі Queue визначено методи:
• boolean add(E o) вставляє елемент у чергу, якщо черга повністю заповнена, то генерує виняток IllegalStateException;
• boolean offer(E o) вставляє елемент у чергу, якщо можливо;
• E element() повертає, але не видаляє головний елемент черги;
• E peek() повертає, але не видаляє головний елемент черги, повертає null, якщо черга порожня;
• E poll() повертає та видаляє головний елемент черги, повертає null, якщо черга порожня;
• E remove() повертає та видаляє головний елемент черги. Методи element() і remove() відрізняються від методів peek() і poll() тим, що генерують виняток NoSuchElementException, якщо черга порожня.
Інтерфейс Deque розширює інтерфейс Queue та визначає поведінку двонапрямної черги, яка працює як звичайна однонапрямна черга або як стек, що діє за принципом LIFO (останній увійшов – перший вийшов).
ArrayDeque<E> ad = new ArrayDeque<>();
В інтерфейсі Deque визначено методи:
• void addFirst(E obj) додає елемент на початок черги;
• void addLast(E obj) додає елемент obj в кінець черги;
• E getFirst() повертає без видалення елемент із голови черги; якщо черга порожня, генерує виняток NoSuchElementException;
• E getLast() повертає без видалення останній елемент черги. Якщо черга порожня, генерує виняток NoSuchElementException;
• boolean offerFirst(E obj) додає елемент obj на початок черги. Якщо елемент вдало доданий, повертає true, інакше – false;
• boolean offerLast(E obj) додає елемент obj в кінець черги. Якщо елемент вдало доданий, повертає true, інакше – false;
• E removeFirst() повертає із видаленням елемент із початку черги. Якщо черга порожня, генерує виняток NoSuchElementException.
• E peekFirst() повертає без видалення елемент із початку черги. Якщо черга порожня, повертає значення null;
• E peekLast() повертає без видалення останній елемент черги. Якщо черга порожня, повертає значення null;
• E pollFirst() повертає із видаленням елемент із початку черги. Якщо черга порожня, повертає значення null;
• E pollLast() повертає з видаленням останній елемент черги. Якщо черга порожня, повертає значення null;
• E pop() повертає з видаленням елемент із початку черги. Якщо черга порожня, генерує виняток NoSuchElementException;
• void push(E element) додає елемент на початок черги.
Наявність методів pop і push дає змогу класам, що реалізують цей елемент, діяти як стек. Водночас наявний функціонал також дає змогу створювати двонапрямні черги, що робить класи, які застосовують цей інтерфейс, досить гнучкими.
Інтерфейс Set оголошує поведінку колекції, яка не допускає дублювання елементів.
Інтерфейс SortedSet успадковує Set та оголошує поведінку набору, відсортованого у порядку зростання, який заздалегідь визначений для класу.
Інтерфейс NavigableSet істотно полегшує пошук елементів, наприклад, розташованих поруч із заданим.
Клас HashSet успадковується від абстрактного суперкласу AbstractSet та реалізує інтерфейс Set, використовуючи хеш-таблицю для зберігання колекції.
Ключ (хеш-код) використовується замість індексу доступу до даних, що значно прискорює пошук певного елемента.
Елементи вважаються однаковими, якщо для цих елементів метод equals повертає true.
У Java HashSet реалізований на основі HashMap.
HashSet<E> hs = new HashSet<>();
Конструктори класу HashSet <E>
• HashSet();
• HashSet(Collection c);
• HashSet(int capacity);
• HashSet(int capacity, float loadFactor)
• capacity – кількість комірок для зберігання хеш-кодів;
• loadFactor – відсоток наповненості буфера, після досягнення якого збільшується його розмір (за замовчуванням 0.75).
Клас TreeSet<E> для зберігання об'єктів використовує бінарне дерево.
Під час додавання об'єкта до дерева він одразу ж розміщується у необхідну позицію з урахуванням сортування. Якщо точніше говорити, то на основі TreeMap.
Для порівняння елементів використовується compareTo. Сортування відбувається завдяки тому, що всі елементи, які додаються, реалізують інтерфейси Comparator і Comparable.
TreeSet<E> ts = new TreeSet<>();
Клас LinkedHashSet розширює клас HashSet, не додаючи жодних нових методів. Клас підтримує зв’язний список елементів набору в порядку, в якому вони вставлялися. Це дає змогу організувати впорядковану ітерацію вставлення в набір.
Map
Карта зображень – це об'єкт, який зберігає пару «ключ-значення».
Пошук об'єкта (значення) полегшується порівняно з множинами завдяки томк, що його можна знайти за його унікальним ключем.
Унікальність об'єктів-ключів має забезпечуватися перевизначенням методів hashCode() і equals() класом користувача.
Якщо елемент із зазначеним ключем відсутній у карті, то повертається значення null.
class Map
Класи карт зображень:
• AbstractMap реалізує інтерфейс Map;
• HashMap розширює AbstractMap, використовуючи хеш-таблицю, у якій ключі відсортовані відповідно до значень їхніх хеш-кодів;
• TreeMap розширює AbstractMap, використовуючи дерево, де ключі розташовані у вигляді дерева пошуку у суворому порядку;
• WeakHashMap дає змогу механізму складання сміття видаляти з карти значення по ключу, посилання на який вийшло з області видимості програми;
• LinkedHashMap запам'ятовує порядок додавання об'єктів у карту й утворює двічі зв'язний список ключів.
HashMap ґрунтується на хеш-таблицях, реалізує інтерфейс Map. Ключі та значення можуть бути будь-яких типів, зокрема й null. Ця реалізація не дає гарантій щодо порядку елементів з часом.
LinkedHashMap – розширює клас HashMap. Він створює зв’язний список елементів у карті, які розміщені у порядку, в якому вони вставлялися. Це дає змогу організувати перебір картки у порядку вставлення.
TreeMap – розширює клас AbstractMap та реалізує інтерфейс NavigatebleMap. Він створює колекцію, яка для зберігання елементів використовує дерево. Об'єкти зберігаються у відсортованому порядку за зростанням. Час доступу та вилучення елементів невеликий, що робить клас TreeMap чудовим вибором для зберігання великих обсягів відсортованої інформації, яка має бути швидко знайдена.
WeakHashMap – колекція, яка використовує слабкі посилання для ключів (а не значень).
Слабке посилання (англ. weak reference) – специфічний різновид посилань на об'єкти, що динамічно створюються, в системах зі складання сміття. Відрізняється від звичайних посилань тим, що не враховується збирачем сміття під час виявлення об'єктів, що підлягають видаленню. Посилання, які є слабкими, також іноді називають «сильними».
interfaces Map
Інтерфейси карт зображень:
• Map<K, V> відображає унікальні ключі та значення;
• Map.Entry<K, V> визначає пару «ключ-значення»;
• SortedMap<K, V> містить відсортовані ключі та значення;
• NavigableMap<K, V> додає нові можливості пошуку за ключем.
В інтерфейсі Map є вкладений інтерфейс Map.Entry<K, V>, який містить такі методи:
• K getKey() повертає ключ поточної пари;
• V getValue() повертає значення поточної пари;
• V setValue (V obj) встановлює значення об'єкта obj у парі.
Інтерфейс Comparable
В інтерфейсі Comparable оголошено лише один метод – compareTo(Object obj).
Він призначений реалізації впорядкування об'єктів класу. compareTo() зручно використовувати під час сортування впорядкованих списків чи масивів об'єктів. Цей метод порівнює викликаний об'єкт з obj.
На відміну від методу equals(), який повертає true або false, compareTo() повертає:
• 0, якщо значення рівні;
• негативне значення, якщо викликаний об'єкт менший за параметр;
• позитивне значення, якщо викликаний об'єкт більший за параметр.
Інтерфейс Comparator
В інтерфейсі Comparator оголошено два методи: compareTo (Object obj1, Object obj2) та equals (Object obj).
compareTo (Object obj1, Object obj2) так само як і метод compareTo інтерфейсу Comparable, упорядковує об'єкти класу.
Так само на виході отримує 0, позитивне значення і негативне значення.
Метод може викинути виняток ClassCastException, якщо типи об'єктів не сумісні під час порівняння.
Основною відмінністю інтерфейсу Comparator від Comparable є те, що можна створювати кілька різновидів незалежних сортувань.
Q&A
Дякую всім за заняття!🙌🏻
❗️🎓Тема уроку: 1. Iterator & Comparator
Нагадую, що дедлайн здачі домашніх робіт – до наступного уроку.
Якщо виникають складнощі, пишіть, допоможу із задоволенням 😌
Запис лекції тренер опублікує трохи пізніше 🖥
Не забудьте повторити матеріал та підготуватися до наступного уроку📚
Успіху і до зустрічі!🤩
PRO. 1
Прізвище
Ім'я
По батькові
Стать
Посада
Дата народження
Вивести дані про інженерів, пенсійного віку (чоловікам більше 65-ти років, жінкам 60).
PRO. 2
No поїзда
Пункт і час прибуття
Пункт і час відбуття
Вивести всі відомості про поїзди, час перебування в дорозі яких перевищує 7 годин 20 хвилин.
Обчислити середню вартість усіх комп'ютерів і надрукувати найменування комп'ютерів та їхню середню вартість.
PRO. 3
Прізвище
Ім'я
По батькові
Посада
Зарплата
Дата народження
Вивести відомості про працівників, у яких зарплата вища за середню і вік менше 30-ти років.
Дякую всім за заняття!🙌🏻
❗️🎓Тема уроку: 2. Collection Framework
Нагадую, що дедлайн здачі домашніх робіт – до наступного уроку.
Якщо виникають складнощі, пишіть, допоможу із задоволенням 😌
Запис лекції тренер опублікує трохи пізніше 🖥
Не забудьте повторити матеріал та підготуватися до наступного уроку📚
Успіху і до зустрічі!🤩