Руководство по Apache Commons CircularFifoQueue

Руководство по Apache Commons CircularFifoQueue

1. обзор

В этом кратком руководстве мы рассмотрим структуру данныхCircularFifoQueue, предоставленную в пакетеcollections4.queue библиотеки Apache Commons Collections..

CircularFifoQueue<E> реализует интерфейсQueue<E> и представляет собойfixed-size,non-blocking queue -when you add an element to a queue that is full, the oldest element is removed to make room for the new element.

2. Maven Dependency

Для проектов Maven нам нужно добавить необходимую зависимость:


    org.apache.commons
    commons-collections4
    4.1

Вы можете найти последнюю версию этой библиотеки наMaven Central.

3. Конструкторы

Чтобы создать объектCircularFifoQueue, мы можем использовать конструктор по умолчанию, который создает очередь с размером по умолчанию 32:

CircularFifoQueue bits = new CircularFifoQueue();

Если мы знаем желаемый максимальный размер нашей очереди, мы можем использовать конструктор, который принимаетint в качестве аргумента для указания размера:

CircularFifoQueue colors = new CircularFifoQueue<>(5);

Также есть возможность создать объектCircularFifoQueue, передав конструктору коллекцию в качестве аргумента.

В этом случае очередь будет заполнена элементами коллекции, а ее размер будет равен размеру коллекции:

CircularFifoQueue daysOfWeek = new CircularFifoQueue<>(days);

Примечание: так как эта очередь уже заполнена при создании, любое добавление приведет к удалению первого созданного элемента.

4. Добавление элементов

Как и в любой реализацииQueue, мы можем добавлять элементы с помощью методовadd иoffer. Queue JavaDoc указывает, что методoffer предназначен для использования при работе с очередью, имеющей ограниченную емкость.

Однако, посколькуCircularFifoQueue не блокируется, вставки не могут завершиться ошибкой. В результате его методыadd иoffer демонстрируют одинаковое поведение.

Давайте посмотрим, как мы можем добавлять элементы в нашу очередьcolors, используя методadd:

colors.add("Red");
colors.add("Blue");
colors.add("Green");

И давайте добавим несколько элементов с помощью методаoffer:

colors.offer("White");
colors.offer("Black");

5. Удаление и получение элементов

КлассCircularFifoQueue предлагает нам несколько методов, которые могут быть полезны, когда нам нужно манипулировать элементами очереди. Некоторые методы используются для получения элементов из очереди, некоторые для удаления элементов, а некоторые для выполнения обеих операций одновременно.

5.1. Peek Метод

Методpeek неразрушающий, аreturns the head of the queue.

Этот метод всегда будет возвращать один и тот же элемент до тех пор, пока не было никаких изменений в элементах в очереди между вызовами. If the queue is empty, peek will return null:с

String colorsHead = colors.peek();

5.2. Element Метод

Методelement похож на методpeek - itreturns the current head of the queue.

Однако методelement выдает исключение, если очередь пуста:

colorsHead = colors.element();

5.3. Get Метод

Когда нам нужно получить определенный элемент из очереди, мы можем использовать методget. Этот метод принимает в качестве аргумента индекс нужного элемента. Индекс очереди начинается с нуля.

Давайте возьмем элемент из очередиcolors, которую мы заполнили элементами ранее:

String color = colors.get(1);

Это вернет «Blue».

Теперь давайте добавим три элемента в нашу очередь и снова проверим этот результат:

colors.add("Orange");
colors.add("Violet");
colors.add("Pink");

color = colors.get(1);

На этот раз методget возвращает «Black». Это связано с тем, что наша очередь была создана с ограниченным размером в пять, а первые три элемента («Red», «Blue», «Green») были удалены с добавлением новые.

5.4. Poll Метод

Методpollremoves the head element of the queue and returns that element. Если в очереди нет элементов, методpoll возвращаетnull:

colorsHead = colors.poll();

5.5. Remove Метод

The remove methodoperates much like the poll method - возвращает заголовок очереди и удаляет возвращенный элемент. Однако, if the queue is empty, remove will throw an exception:

colorsHead = colors.remove();

5.6. Clear Метод

Мы можем использовать методclear, когда хотим очистить нашу очередь:

colors.clear();

6. Методы проверки

После того, как мы увидели, как мы можем добавлять, удалять и извлекать элементы очереди, давайте посмотрим, что предлагает класс в отношении проверки его размера и емкости. Мы будем использовать очереди, созданные в предыдущих разделах, в наших примерах.

В общем, мы имеем в своем распоряжении два метода для проверки размера нашей очереди - один для получения максимального размера объекта и один для проверки его текущего количества элементов.

МетодmaxSize вернет значениеinteger максимального размера очереди:

int maxSize = bits.maxSize();

Это вернет32, поскольку очередьbits была создана с помощью конструктора по умолчанию.

Методsize вернет количество элементов, хранящихся в настоящее время в очереди:

int size = colors.size();

Чтобы проверить емкость объекта очереди, мы можем использовать методыisEmpty иisAtFullCapacity.

МетодisEmpty вернет значениеboolean, которое указывает, пуста ли очередь или нет:

boolean isEmpty = bits.isEmpty();

Чтобы проверить, заполнена ли наша очередь, мы можем использоватьthe isAtFullCapacity method. Этот методreturns true only if the maximum size of elements in the queue has been reached:

boolean isFull = daysOfWeek.isAtFullCapacity();

Обратите внимание, что это методavailable as of version 4.1.

Другой метод интерфейсаQueue, который мы можем использовать, чтобы проверить, заполнена ли наша очередь, - это методisFull. ДляCircularFifoQueue,the isFull method will always return false, because the queue can always accept new elements:

boolean isFull = daysOfWeek.isFull();

7. Заключение

В этой статье мы увидели, как использовать Apache CommonsCircularFifoQueue. Мы видели несколько примеров, которые иллюстрируют, как создать экземпляр объекта очереди, как его заполнить, как очистить его, как получить и удалить элементы из него, и как проверить его размер и емкость.

Вы можете найти полный пример кода, использованного в этой статье, в нашемGitHub project. Это проект Maven, поэтому вы можете импортировать его и запустить как есть.