collections - Java 中保存最后 N 个元素的大小受限队列

标签 collections queue java

关于 Java 库的一个非常简单和快速的问题:是否有一个现成的类实现具有固定最大大小的 Queue - 即它总是允许添加元素,但它会默默地删除头元素为新添加的元素提供空间。

当然,手动实现也很简单:

import java.util.LinkedList;

public class LimitedQueue<E> extends LinkedList<E> {
    private int limit;

    public LimitedQueue(int limit) {
        this.limit = limit;
    }

    @Override
    public boolean add(E o) {
        super.add(o);
        while (size() > limit) { super.remove(); }
        return true;
    }
}

据我所知,Java 标准库中没有标准实现,但可能在 Apache Commons 或类似的东西中有一个?

最佳答案

Apache commons collections 4 有一个 CircularFifoQueue<>这就是你要找的。引用 javadoc:

CircularFifoQueue is a first-in first-out queue with a fixed size that replaces its oldest element if full.

    import java.util.Queue;
    import org.apache.commons.collections4.queue.CircularFifoQueue;

    Queue<Integer> fifo = new CircularFifoQueue<Integer>(2);
    fifo.add(1);
    fifo.add(2);
    fifo.add(3);
    System.out.println(fifo);

    // Observe the result: 
    // [2, 3]

如果您使用的是旧版本的 Apache 公共(public)集合 (3.x),您可以使用 CircularFifoBuffer没有泛型,这基本上是一样的。

更新:在支持泛型的公共(public)集合版本 4 发布后更新了答案。

关于collections - Java 中保存最后 N 个元素的大小受限队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5498865/

相关文章:

java - 循环数组队列中的余数操作数有什么意义

java - 冲突的模块。 LoggerFactory 不是 Logback LoggerContext 但 Logback 在类路径上

Laravel:为了安全起见,队列工作失败 pcntl_signal()

java - 不支持的主要.次要版本 52.0 mvn java SE 8

java - 如何使用 DynamicReports 加载后自动打印报告?

java - 如何在Java中使用键名及其值存储数据?

scala - 在 Scala 中,如何解决 TraversableLike.toIterator 效率低下的中间流

swift - 如何安全地解开 header 值

c# - 使用哪个 C# 集合代替 List<KeyValuePair<string, double>>?

c++ - 尝试使用该类的结构中的变量来创建自定义类的优先级队列