首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中的环形缓冲区

Java中的环形缓冲区
EN

Stack Overflow用户
提问于 2011-09-01 12:10:53
回答 8查看 128K关注 0票数 83

我有一个流时间序列,我有兴趣保留最后4个元素,这意味着我希望能够弹出第一个元素,并添加到最后。本质上,我需要的是一个。

哪种Java集合是最好的?向量?

EN

回答 8

Stack Overflow用户

发布于 2011-09-01 12:38:07

考虑一下Apache Common.Collections中的CircularFifoBuffer。与Queue不同,您不必保持底层集合的有限大小,并在达到限制时对其进行包装。

代码语言:javascript
复制
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的删除顺序基于插入顺序;元素的删除顺序与添加元素的顺序相同。迭代顺序与删除顺序相同。

(Object),BoundedFifoBuffer.remove()和BoundedFifoBuffer.get()操作都在固定时间内执行。所有其他操作的执行时间都是线性的,甚至更糟。

然而,你也应该考虑到它的局限性-例如,你不能向这个集合中添加缺少的timeseries,因为它不允许空值。

注意:当使用当前队列(4.*)时,您必须使用Common Collections。如下所示:

代码语言:javascript
复制
Queue buf = new CircularFifoQueue(4);
票数 99
EN

Stack Overflow用户

发布于 2013-12-12 23:38:39

从Guava15.0(2013年9月发布)开始,就有了EvictingQueue

一个非阻塞队列,当尝试向队列添加新元素时,当队列已满时,它会自动从队列头部逐出元素。驱逐队列必须配置最大大小。每次将元素添加到已满队列中时,队列都会自动删除其头元素。这与传统的有界队列不同,传统的有界队列在满时要么阻塞新元素,要么拒绝新元素。

此类不是线程安全的,并且不接受null元素。

示例用法:

代码语言:javascript
复制
EvictingQueue<String> queue = EvictingQueue.create(2);
queue.add("a");
queue.add("b");
queue.add("c");
queue.add("d");
System.out.print(queue); //outputs [c, d]
票数 53
EN

Stack Overflow用户

发布于 2012-08-07 16:37:57

从Java1.6开始,出现了ArrayDeque,它实现了Queue,看起来比LinkedList更快,内存效率更高,并且没有ArrayBlockingQueue的线程同步开销: API文档中写道:“这个类用作堆栈时可能比stack快,用作队列时比LinkedList快。”

代码语言:javascript
复制
final Queue<Object> q = new ArrayDeque<Object>();
q.add(new Object()); //insert element
q.poll(); //remove element
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7266042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档