大小受限的队列,用于保存 Java 中的最后 N 个元素

2022-08-31 05:57:37

关于Java库的一个非常简单和快速的问题:是否有一个现成的类来实现具有固定最大大小的a - 即它始终允许添加元素,但它会静默地删除head元素以容纳新添加的元素的空间。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 stdlibs中没有标准的实现,但是在Apache Commons或类似的东西中可能有一个?


答案 1

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

CircularFifoQueue 是一个先进先出的队列,具有固定大小,如果已满,则替换其最旧的元素。

    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共享资源集合(3.x),则可以使用CircularFifoBuffer,它基本上与没有泛型的东西相同。

更新:在共享资源集合版本4发布后更新了支持泛型的答案。


答案 2

Guava现在有一个EvictingQueue一个非阻塞队列,当尝试将新元素添加到队列中时,它会自动从队列的头部驱逐元素,并且它已经满了。

import java.util.Queue;
import com.google.common.collect.EvictingQueue;

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

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

推荐