【问题标题】:java : queue with maximum capacity [duplicate]java:具有最大容量的队列[重复]
【发布时间】:2012-12-05 20:20:11
【问题描述】:

可能重复:
Size-limited queue that holds last N elements in Java
Java - Ring Buffer

我对上面的有界队列感兴趣,每当遇到对象插入时,如果插入会导致“溢出”,则会首先删除最旧的对象。我希望添加为 O(1) 并且内存使用量尽可能少。我正在考虑在 LinkedList 上覆盖 add 方法,但理想情况下,我会实现一个循环的、基于数组的列表,并捕获前/后指针。每当添加超过容量时,前指针前进,然后是后指针。有没有类似的实现方式?

【问题讨论】:

标签: java collections queue


【解决方案1】:

链表很浪费内存,因为 next 指针使用 mem,而 ArrayList 没有。

高性能实现基于 ArrayList 或更好的数组。 如果你的循环缓冲区大小是固定的,你会使用一个数组。

我使用内部数组实现了一个循环缓冲区,其中包含开始和结束位置索引变量。我没有找到循环列表/缓冲区的实现,这就是我想要的。

实现起来并不难,但我建议使用大量单元测试用例,以证明您的 circ 缓冲区按预期工作。

【讨论】:

  • 关于ArrayList 的警告:至少 OpenJDK 实现不是基于循环数组:删除一个项目 - 任何项目 - 会导致内部数组的部分副本。删除 first 项实际上会移动 all 剩余元素 - 绝对不是您想要经常做的事情...
  • 这取决于循环缓冲区的类型:很少需要从中间删除。通常你只添加到缓冲区。最旧的元素被新元素覆盖。只有 start 和 pos 必须正确维护。从前面移除也应该通过移动 curStat 索引来工作。使用 memcopy 在数组中移动比重新分配两个指针要快得多,即使那是 100000 个元素。当您不考虑前置因素时,大 O 符号就没有用了。
  • 1. “使用 memcopy 在数组中移动比重新分配两个指针要快得多”:你介意限定这个语句吗,因为对我来说它没有任何意义。 2. 正如我所说,ArrayList 通常在内部 使用循环缓冲区——我想你可以将它用作美化数组并维护自己的索引,但是为什么不使用原始数组直接地?另一方面,ArrayDeque确实使用了一个循环数组但是 IIRC它没有实现List接口,这很可惜......
  • 是的,我写道使用数组是最好的。但是当最大 Buffer Size 可以动态变化时,One 就必须进一步考虑。在这些情况下,Arraylist 可能会减少编程工作。
  • @thkala ArrayList 从不基于 oj 循环数组。你从哪里得到的?
猜你喜欢
  • 1970-01-01
  • 2013-08-24
  • 1970-01-01
  • 2018-02-04
  • 2011-11-28
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
  • 2020-10-01
相关资源
最近更新 更多