Contents

CircularFifoQueue 简介

1. 概述

在本快速教程中,我们将了解Apache Commons Collections 库的collections4.queue包中提供的**CircularFifoQueue*数据结构。

*CircularFifoQueue实现了Queue*接口,并且是一个固定大小的非阻塞队列——当你将一个元素添加到一个已满的队列中时,最旧的元素会被移除,以便为新元素腾出空间

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();

如果我们知道队列所需的最大大小,我们可以使用以int作为参数的构造函数来指定大小:

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

还有一个选项可以通过给构造函数一个集合作为参数来创建一个CircularFifoQueue对象。

在这种情况下,队列将被集合的元素填充,其大小将与集合的大小相同:

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

注意:由于这个队列在构造时已经满了,任何添加都会导致第一个创建的元素被丢弃。

4. 添加元素

与任何Queue实现一样,我们可以使用addoffer方法添加元素。Queue 文档 指定要在处理容量受限的队列时使用offer方法。

但是,由于CircularFifoQueue是非阻塞的,因此插入不会失败。因此,它的addoffer方法表现出相同的行为。

让我们看看如何使用add方法将元素添加到colors队列中:

colors.add("Red");
colors.add("Blue");
colors.add("Green");

让我们使用offer方法添加一些元素:

colors.offer("White");
colors.offer("Black");

5. 删除和检索元素

CircularFifoQueue类为我们提供了一些在我们需要操作队列元素时很有用的方法。一些方法用于从队列中获取元素,一些用于移除元素,还有一些用于同时执行这两种操作。

5.1. peek方法

peek方法是非破坏性的,并返回队列的头部

只要在调用之间队列中的元素没有任何更改,此方法将始终返回相同的元素。如果队列为空,peek将返回null

String colorsHead = colors.peek();

5.2. element方法

element方法类似于peek ——它返回队列的当前头部

但是,如果队列为空,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 ”。这是因为我们创建的队列大小限制为 5,并且前三个元素(“ Red ”、“ Blue ”、“ Green ”)随着新元素的添加而被删除。

5.4. poll方法

poll方法删除队列的头元素并返回该元素。如果队列没有元素,则poll方法返回null

colorsHead = colors.poll();

5.5. remove方法

remove方法的操作很像poll方法**——它返回队列的头部并删除返回的元素。但是**,如果队列为空,remove会抛出异常**:

colorsHead = colors.remove();

5.6. clear方法

当我们想清空队列时,我们可以使用clear方法:

colors.clear();

6. 检查方法

在了解了如何添加、删除和检索队列元素之后,让我们看看该类在检查其大小和容量方面必须提供什么。我们将在示例中使用在前面部分中创建的队列。

一般来说,我们可以使用两种方法来检查队列的大小——一种用于获取对象的最大大小,另一种用于检查其当前元素计数。

maxSize方法将返回队列最大大小的整数值:

int maxSize = bits.maxSize();

这将返回32,因为队列是使用默认构造函数创建的。

size方法将返回当前存储在队列中的元素数量:

int size = colors.size();

要检查队列对象的容量,我们可以使用isEmptyisAtFullCapacity方法。

isEmpty方法将返回一个boolean值,指示队列是否为空:

boolean isEmpty = bits.isEmpty();

要检查我们的队列是否已满,我们可以使用isAtFullCapacity方法。仅当已达到队列中元素的最大大小时,此方法才返回true

boolean isFull = daysOfWeek.isAtFullCapacity();

我们可以使用Queue接口的另一个方法来检查我们的队列是否已满,isFull方法。对于CircularFifoQueueisFull方法将始终返回false,因为队列始终可以接受新元素**:

boolean isFull = daysOfWeek.isFull();