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, поэтому вы должны иметь возможность импортировать его и запускать как есть.