我们在应用中有时会用到这样一个数据结构——一个大小固定的队列,每次插入数据后最新的数据被删除,就类似一个圈,每次加入新元素后旧元素被覆盖。

1、EvictingQueue:

Guava现在有一个EvictingQueue , 一个非阻塞队列,当尝试向队列中添加新元素并且它已满时,会自动从其头部驱逐一个元素。我们可以把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]

2、手动实现:

我们也可以借助先有的数据结构,自己实现这个逻辑:

import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;
import java.util.stream.IntStream;
import com.google.common.collect.EvictingQueue;
import com.google.common.collect.MinMaxPriorityQueue;

public class Test1 {

public static void main(String[] args) {

LimitedQueue<String> qu = new LimitedQueue<>(2);
qu.add("1");
qu.add("2");
qu.add("3");

System.out.println(qu);
}
}

class LimitedQueue<E> extends LinkedList<E> {
private static final long serialVersionUID = 1L;
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;
}
}

输出:[2, 3]

​https://www.baeldung.com/guava-minmax-priority-queue-and-evicting-queue​