【发布时间】:2025-12-07 04:10:02
【问题描述】:
我需要一种数据结构,可以有效地以 FIFO 顺序缓冲特定数量的元素。
正如this question 中提到的,Apache Commons 有一个 CircularFifoBuffer,但遗憾的是它没有通用化。 Some forks 存在,但我不确定它们的维护状态。
既然 Guava 是满足我收藏需求的首选图书馆,我想知道:Guava 有没有好的替代品?如果没有,我是否应该在我的项目中实现它,基于 Apache Commons 的 CircularFifoBuffer?
【问题讨论】:
-
“循环”部分需要什么? “无限”迭代?
-
“循环”部分是指常见的实现,它是一个数组,有两个索引指向缓冲区的开始和结束。当数组已满时,数据结构在数组的开头再次开始写入,以“循环”方式覆盖最旧的元素。这个实现很酷的一点是,您不需要像在 LinkedList 中那样创建不必要的条目,从而减少了垃圾收集。由于我不需要删除缓冲区中间的元素,这似乎是一个完美的选择。
-
是的,对不起,我只是在发布第一条评论后才去阅读 javadoc ;) 看起来 Guava 没有“有限大小的集合”,所以你可能注定要自己实现这个:/
-
这是一项必需的功能,当已满时,最旧的条目会被覆盖?如果是这样,我会删除我的答案,因为
ArrayBlockingQueue会在满时阻塞。 -
好吧,我有两个用例。 1)我想保留我们的应用程序处理的最后 N 个事件的滚动缓冲区,并在抛出异常时记录这些事件。理想情况下,缓冲区应该自动覆盖最旧的事件,而不是手动执行。 2) 我有一个缓冲最后 10 个事件的转换。当缓冲区已满时,我想处理最旧的事件并将其从缓冲区中删除。所以在这种情况下,删除是手动的。
标签: java collections guava apache-commons