1. Обзор
В этом кратком руководстве мы рассмотрим структуру данных CircularFifoQueue , представленную в пакете collections4.queue библиотеки коллекций Apache Commons .
CircularFifoQueue реализует интерфейс Queue и представляет собой фиксированный размер , неблокирующую очередь — при добавлении элемента в заполненную очередь самый старый элемент удаляется, чтобы освободить место для нового элемента .
2. Зависимость Maven
Для проектов Maven нам нужно добавить необходимую зависимость:
org.apache.commons commons-collections4 4.1
Вы можете найти последнюю версию этой библиотеки на Maven Central .
3. Конструкторы
Чтобы создать объект CircularFifoQueue , мы можем использовать конструктор по умолчанию, который создает очередь с размером по умолчанию 32:
CircularFifoQueuebits = new CircularFifoQueue();
Если мы знаем желаемый максимальный размер нашей очереди, мы можем использовать конструктор, который принимает int в качестве аргумента, чтобы указать размер:
CircularFifoQueuecolors = new CircularFifoQueue<>(5);
Существует также возможность создать объект CircularFifoQueue , предоставив конструктору коллекцию в качестве аргумента.
В этом случае очередь будет заполнена элементами коллекции, и ее размер будет таким же, как и размер коллекции:
CircularFifoQueuedaysOfWeek = 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, поэтому вы должны иметь возможность импортировать его и запустить как есть.