一尘不染

Java中的环形缓冲区

java

我有一个流时间序列,我有兴趣保留最后4个元素,这意味着我希望能够弹出第一个元素并将其添加到末尾。本质上我需要一个环形缓冲区。

哪个Java集合最适合此用途?向量?


阅读 801

收藏
2020-03-14

共1个答案

一尘不染

考虑CircularFifoBuffer Apache的Common.Collections。与Queue不同,你不必维护基础集合的有限大小,只要达到极限就可以包装它。

Buffer buf = new CircularFifoBuffer(4);
buf.add("A");
buf.add("B");
buf.add("C");
buf.add("D"); //ABCD
buf.add("E"); //BCDE

由于以下属性,CircularFifoBuffer会为你完成此操作:

  • CircularFifoBuffer是固定大小的先进先出缓冲区,如果已满,它将替换其最早的元素。
  • CircularFifoBuffer的删除顺序基于插入顺序;元素将按照添加顺序相同的顺序删除。迭代顺序与删除顺序相同。
  • add(Object),BoundedFifoBuffer.remove()和BoundedFifoBuffer.get()操作均在固定时间内执行。所有其他操作都在线性时间内或更差的时间执行。
    但是,你也应该考虑到它的局限性-例如,你不能向该集合添加丢失的时间序列,因为它不允许空值。

注意:使用当前的通用集合(4. *)时,必须使用队列。像这样:

Queue buf = new CircularFifoQueue(4);
2020-03-14