我有一个流式时间序列,我有兴趣保留最后 4 个元素,这意味着我希望能够弹出第一个元素,然后添加到最后。基本上我需要的是 ring buffer .
哪个 Java 集合最适合这个? vector ?
最佳答案
考虑 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() 操作都在恒定时间内执行。 所有其他操作都在线性时间或更短的时间内执行。
但是您也应该考虑到它的局限性 - 例如,您不能将缺失的时间序列添加到此集合中,因为它不允许空值。
注意:使用当前 Common Collections 时(4.*),你必须使用队列。像这样:
Queue buf = new CircularFifoQueue(4);
关于java - Java中的环形缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7266042/