Перейти к основному содержимому

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

· 5 мин. чтения

1. Обзор

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

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

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

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

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.1</version>
</dependency>

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

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

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

CircularFifoQueue<String> bits = new CircularFifoQueue();

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

CircularFifoQueue<String> colors = new CircularFifoQueue<>(5);

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

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

CircularFifoQueue<String> daysOfWeek = new CircularFifoQueue<>(days);

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

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

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

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

Давайте посмотрим, как мы можем добавить элементы в нашу очередь цветов , используя метод 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. Метод элемента

Метод элемента похож на peek — он возвращает текущую голову очереди .

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

colorsHead = colors.element();

5.3. Получить метод

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

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

String color = colors.get(1);

Это вернет « Синий ».

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

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

color = colors.get(1);

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

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

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

colorsHead = colors.poll();

5.5. Удалить метод

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

colorsHead = colors.remove();

5.6. Очистить метод

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

colors.clear();

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

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

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

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

int maxSize = bits.maxSize();

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

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

int size = colors.size();

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

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

boolean isEmpty = bits.isEmpty();

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

boolean isFull = daysOfWeek.isAtFullCapacity();

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

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

boolean isFull = daysOfWeek.isFull();

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

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

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