четвер, 30 квітня 2020 р.

Клас ArrayDeque (Java)

ArrayDeque, Java, Колекції, Коллекции
ArrayDeque (читається як еррейдек) – це клас який забезпечує двосторонню чергу. Іншими словами - це автоматично зростаючий масив, що дозволяє нам додавати або видаляти елементи з обох боків черги. ArrayDeque може бути використано як стек (LIFO, останній ввійшов - перший вийшов) або ж як черга (FIFO, перший ввійшов - перший вийшов).

ArrayDeque не може містити в якості елемента null.

Клас ArrayDeque швидший за клас Stack, якщо використовувати його в якості стеку і швидший за LinkedList, якщо використовувати в якості черги.

ArrayDeque розширює клас AbstractCollection та реалізує інтерфейси Deque, Cloneable, Serializable. Таким чином ми можемо використовувати для роботи з даним класом, як методи інтерфейсу Deque (який розширює інтерфейс Queue) так і методи інтерфейсу Collection.

Якщо використовується ітератор, то він буде викидати виняток ConcurrentModificationException, якщо вміст ArrayDeque був модифікований після створення ітератора. Таким чином ітератор необхідно з обережністю використовувати з ArrayDeque.


В ArrayDeque доступні наступні конструктори:
ArrayDeque() // пустий ArrayDeque з початковим об’ємом 16 елентів
ArrayDeque(Collection c) // міститиме елементи колекції в порядку, що повертає ітератор даної колекції
ArrayDeque(int numElements) // дозволяє задати початковий об’єм
При потребі збільшення об'єму, то він автоматично збільшується вдвічі.

Наступний приклад демонструє роботу із ArrayDeque у вигляді стека та у в вигляді черги:
import java.util.ArrayDeque;

public class TestArrayDeque {

    public static void main(String[] args) {
         ArrayDeque<String> ad=new ArrayDeque<>();
     
         System.out.println("Використання в якості стеку");
         ad.push("Перший"); // метод інтерфуйсу Deque
         ad.push("Другий"); 
         ad.push("Третій");
         System.out.println("Перший елемент ArrayDeque: "+ad.getFirst());//Отримуємо перший елемент, але не видаляємо
         System.out.println("Вміст ArrayDeque: "+ad);
         System.out.println(ad.pop()); //Отримуємо і видаляємо з вершини стеку
         System.out.println(ad.pop()); //еквівалентно до removeFirst()
         System.out.println(ad.pop()); 
         //System.out.println(ad.pop()); //ArrayDeque порожній видасть NoSuchElementException
         System.out.println();
         System.out.println("Використання в якості черги");
         
         ad.offer("Перший"); 
         ad.offer("Другий"); 
         ad.offer("Третій");
         System.out.println("Перший елемент ArrayDeque: "+ad.getFirst());//Отримуємо перший елемент, але не видаляємо
         System.out.println("Вміст ArrayDeque: "+ad);
         System.out.println(ad.poll()); //витягнути і видалити з голови
         System.out.println(ad.poll());
         System.out.println(ad.poll());
         System.out.println(ad.poll());
    }

}

Результат роботи:
Використання в якості стеку
Перший елемент ArrayDeque: Третій
Вміст ArrayDeque: [Третій, Другий, Перший]
Третій
Другий
Перший

Використання в якості черги
Перший елемент ArrayDeque: Перший
Вміст ArrayDeque: [Перший, Другий, Третій]
Перший
Другий
Третій
null
Дивіться також:

Немає коментарів:

Дописати коментар