Рубрики
Без рубрики

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

Краткое и практическое руководство по структуре данных CircularFifoQueue из Apache Commons.

Автор оригинала: baeldung.

1. Обзор

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

CircularFifoQueue реализует интерфейс Queue и представляет собой фиксированный размер , неблокирующую очередьпри добавлении элемента в заполненную очередь самый старый элемент удаляется, чтобы освободить место для нового элемента .

2. Зависимость Maven

Для проектов 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 вернет null:

String colorsHead = colors.peek();

5.2. Метод элементов

Метод element аналогичен методу peek — он возвращает текущий заголовок очереди .

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

colorsHead = colors.element();

5.3. Метод получения

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

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

String color = colors.get(1);

Это вернет ” Синий “.

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

colors.add("Orange");
colors.add("Violet");
colors.add("Pink");
		
color = colors.get(1);

На этот раз метод get возвращает ” Black “. Это связано с тем, что наша очередь была создана с ограниченным размером в пять, и первые три элемента (” Красный “, ” Синий “, ” Зеленый “) были удалены с добавлением новых.

5.4. Метод опроса

Метод poll удаляет головной элемент очереди и возвращает этот элемент . Если в очереди нет элементов, метод poll возвращает null:

colorsHead = colors.poll();

5.5. Метод удаления

Метод remove | работает так же, как метод poll — он возвращает заголовок очереди и удаляет возвращаемый элемент. Однако , если очередь пуста, remove вызовет исключение :

colorsHead = colors.remove();

5.6. Четкий метод

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

colors.clear();

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

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

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

Метод max Size вернет целое число значение максимального размера очереди:

int maxSize = bits.maxSize();

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

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

int size = colors.size();

Чтобы проверить емкость объекта очереди, мы можем использовать методы is Empty и is At Full Capacity .

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

boolean isEmpty = bits.isEmpty();

Чтобы проверить, заполнена ли наша очередь, мы можем использовать метод на полную мощность . Этот метод возвращает true только в том случае, если достигнут максимальный размер элементов в очереди :

boolean isFull = daysOfWeek.isAtFullCapacity();

Обратите внимание, что этот метод доступен с версии 4.1 .

Другой метод интерфейса Queue , который мы можем использовать для проверки заполненности нашей очереди, – это метод isFull . Для CircularFifoQueue , метод isFull всегда будет возвращать false, потому что очередь всегда может принимать новые элементы :

boolean isFull = daysOfWeek.isFull();

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

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

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