定长队列保存最后N个元素

2021-04-25  本文已影响0人  明训

需求背景

解决方案

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"));
}

资料参考

上一篇 下一篇

猜你喜欢

热点阅读