java - Java中的环形缓冲区

标签 java buffer

我有一个流式时间序列,我有兴趣保留最后 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/

相关文章:

node.js - native websocket api NodeJS的较大的消息?

c++ - 为什么 std::cin 的提取器操作符等待用户输入?

java - 为什么我对字符串的空检查不起作用?

c++ - 如何将缓冲区中的字符串添加到另一个数组并打印出来?

java - 使用 SQLite 处理 POJO 的 DAO 创建的更好模式

java - java中的<TYPE>是什么意思?

c++ - 输出缓冲区和 Ctrl+C 退出程序

tcp - Go:有效处理通过 TCP 接收的碎片数据

java - 放入 <result> 标签时不执行 MyBatis 自定义 TypeHandler

java - 获取 java.lang.ExceptionInInitializerError