Множини, черги

Типи даних і винятки в Java

Jim White

Java Developer

Інтерфейс Set

  • Set — це теж різновид Collection
    • Не допускає дублікати об'єктів
      • Гарантує унікальність кожного елемента
    • Об'єкти Set зазвичай не впорядковані (тобто без індексів)
  • List — як пілюльниця: кожен об'єкт у своєму відсіку
  • Set — як мішок з об'єктами: елементи лежать у довільному порядку

Списки — як органайзери для пігулок, де об'єкти зберігаються за індексом у певному місці

Множини — як мішки, що тримають об'єкти довільно і без порядку

1 Зображення: Wikimedia Commons
Типи даних і винятки в Java

List vs Set

  • Коли варто використовувати Set
    • Гарантує унікальність елементів
    • Швидші пошуки
      • Перевірка, чи є об'єкт у Set
    • Ефективніше використовує пам'ять зі зростанням колекції
    • Добре для перевірки належності в кешах
      • Наприклад: знаходження унікальних слів у документі
Типи даних і винятки в Java

List vs Set

  • Коли варто використовувати List
    • Зберігає порядок елементів і дозволяє дублікати
    • Краща продуктивність при доступі за позицією
    • Краща продуктивність при додаванні/видаленні за індексом
    • Підходить, коли важливий порядок елементів
      • Напр.: кроки послідовності чи пісні у плейлисті
Типи даних і винятки в Java

Реалізація Set

  • Є багато реалізацій Set
    • HashSet — популярна реалізація
  • HashSet
    • Невпорядкований «мішок» об'єктів
    • Швидший за інші реалізації Set для вставки, видалення та пошуку
    • Зазвичай використовує більше пам'яті, ніж інші реалізації Set
    • Дозволяє зберігати один null

HashSet — невпорядковані мішки об'єктів, дозволяють один null

Типи даних і винятки в Java

Створення HashSet

  • Використайте універсальний параметризований конструктор для створення HashSet
    HashSet<String> set = new HashSet<String>();
    
  • HashSet міститься в пакеті java.util
    • Потрібен імпорт
    • import java.util.HashSet
Типи даних і винятки в Java

Методи HashSet

  • Використовуйте .add() і .remove() для додавання та видалення об'єктів
  • Щоб замінити об'єкт, виконайте .remove(), потім .add()
  • Використовуйте .contains() для перевірки на наявність
  • Дублікати ігноруються
  • Дозволяє null
  • Порядок не гарантується
set.add("France");
set.add("Japan");
set.add("Brazil");
set.add("Egypt");
set.add(null); // null is allowed
set.remove("Brazil");
boolean z =
  set.contains("France"); // z is true
set.add("Japan"); // Ignored
System.out.println(set);
[null, Japan, Egypt, France]
Типи даних і винятки в Java

Інтерфейс Queue

  • Структура даних Queue обробляє об'єкти у порядку «першим прийшов — першим пішов» (FIFO)
    • Перший доданий об'єкт видаляється першим
    • Як черга до каси
    • Має голову (head) і хвіст (tail)

Зображення черги з позначеними головою (початок) і хвостом (кінець)

  • Існує кілька реалізацій Queue
    • Подібні за поведінкою та операціями
Типи даних і винятки в Java

ArrayBlockingQueue

  • Популярна реалізація Queue
    • Усередині базується на масиві
  • Увага: ArrayBlockingQueue у пакеті java.util.concurrent
    • Не в пакеті java.util
Типи даних і винятки в Java

Створення ArrayBlockingQueue

  • Використайте універсальний параметризований конструктор, щоб створити ArrayBlockingQueue
    • Має місткість (обмеження кількості об'єктів), що задається конструктором
import java.util.concurrent;  // На початку класу

// Створіть нову чергу, що зберігає 4 рядки
ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<String>(4);
Типи даних і винятки в Java

Методи ArrayBlockingQueue

  • Використовуйте .add(object) або .offer(object) для додавання в хвіст
    • .add(object) кидає виняток, якщо Queue заповнена
    • .offer(object) ігнорує новий об'єкт, коли досягнуто місткість
ArrayBlockingQueue<String> queue 
    = new ArrayBlockingQueue<String>(4);
queue.offer("France");
queue.offer("Japan");
queue.offer("Brazil");
queue.offer("Egypt");
queue.offer("China"); // Ignores China

// Causes IllegalStateException
// queue.add("China");

System.out.println(queue);
[France, Japan, Brazil, Egypt]
Типи даних і винятки в Java

Методи ArrayBlockingQueue

  • Використовуйте .remove() або .poll() для видалення з голови
    • .remove() кидає виняток, коли Queue порожня
    • .poll() повертає null, коли Queue порожня
  • null не дозволений
ArrayBlockingQueue<String> queue 
    = new ArrayBlockingQueue<String>(4);
String x = queue.poll(); // x is null
// Causes NoSuchElementException
// String y = queue.remove();

queue.offer("France");
String next = queue.poll();
System.out.println(next);
France
Типи даних і винятки в Java

Давайте потренуємось!

Типи даних і винятки в Java

Preparing Video For Download...