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