一尘不染

大小限制的队列,其中包含Java中的最后N个元素

java

关于Java库的一个非常简单Queue而又快速的问题:是否有一个现成的类,该类以固定的最大大小实现—即,它始终允许添加元素,但是它将静默删除head元素以容纳新添加元素的空间。

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

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中可能有这种实现?


阅读 939

收藏
2020-03-04

共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);a
    System.out.println(fifo);

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

如果你使用的是Apache Commons Collections(3.x)的较旧版本,则可以使用CircularFifoBuffer,这与没有泛型的情况基本相同。

更新:更新了支持通用的通用集合第4版之后的答案。

2020-03-04