需求背景
- 队列满了时候再添加元素,会自动弹出先进来的元素,再在后面添加
- 一个固定长度的集合里,当收到新的数据并且已经达到限制长度时自动丢掉最旧的数据这样的队列结构
- 一个大小固定的队列,每次插入数据后最新的数据被删除,就类似一个圈,每次加入新元素后旧元素被覆盖
- 定长队列,新元素会把旧元素挤掉
解决方案
guava工具包
Guava现在有一个EvictingQueue, 一个非阻塞队列,当尝试向队列中添加新元素并且它已满时,会自动从其头部驱逐一个元素。我们可以把EvictingQueue想象成一个我们以仅追加方式插入元素的环。如果我们想要添加新元素的位置上有一个元素,我们只是覆盖给定位置的现有元素。
引入maven依赖
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>28.0-jre</version>
</dependency>
编写代码
public static void main(String[] args) {
Queue<String> queue = EvictingQueue.create(3);
queue.add("1");
queue.add("2");
queue.add("3");
System.out.println(queue.contains("1"));
queue.add("4");
queue.add("5");
System.out.println(queue.contains("1"));
System.out.println(queue.contains("3"));
}
commons-collections4工具包
CircularFifoQueue is a first-in first-out queue with a fixed size that replaces its oldest element if full.
如果您使用的是较早版本的Apache commons集合(3.x),则可以使用 CircularFifoBuffer 基本上没有泛型。
引入maven依赖
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.3</version>
</dependency>
编写代码
public static void main(String[] args) {
CircularFifoQueue<String> queue = new CircularFifoQueue<String>(3);
queue.add("1");
queue.add("2");
queue.add("3");
System.out.println(queue.contains("1"));
queue.add("4");
queue.add("5");
System.out.println(queue.contains("1"));
System.out.println(queue.contains("3"));
}
网友评论