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实现一样,我们可以使用add和offer方法添加元素。Queue 文档 指定要在处理容量受限的队列时使用offer方法。
但是,由于CircularFifoQueue是非阻塞的,因此插入不会失败。因此,它的add和offer方法表现出相同的行为。
让我们看看如何使用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();
要检查队列对象的容量,我们可以使用isEmpty和isAtFullCapacity方法。
isEmpty方法将返回一个boolean值,指示队列是否为空:
boolean isEmpty = bits.isEmpty();
要检查我们的队列是否已满,我们可以使用isAtFullCapacity方法。仅当已达到队列中元素的最大大小时,此方法才返回true:
boolean isFull = daysOfWeek.isAtFullCapacity();
我们可以使用Queue接口的另一个方法来检查我们的队列是否已满,isFull方法。对于CircularFifoQueue,isFull方法将始终返回false,因为队列始终可以接受新元素**:
boolean isFull = daysOfWeek.isFull();