我需要一种能够以FIFO顺序有效缓冲特定数量元素的数据结构。
正如this question中提到的,Apache Commons有一个CircularFifoBuffer,但遗憾的是它没有被广泛化。 Some forks存在,但我不确定其维护状态。
由于Guava是我收藏需求的首选图书馆,我想知道:番石榴有一个很好的选择吗?如果没有,我应该在我的项目中实现它,基于Apache Commons的CircularFifoBuffer?
答案 0 :(得分:29)
启动Guava 15.0 - 您可以使用EvictingQueue
答案 1 :(得分:7)
我在Guava中没有看到类似的内容,但ForwardingQueue
围绕ArrayDeque
建立了{{3}}如何检查add()
,offer()
等的容量。和remove()
旧条目是否已满?
答案 2 :(得分:2)
Commons-Collections with Generics(maven link)是你想要将Apache Collections与泛型一起使用的方法(它包含有效的CircularFifoBuffer<E>
类)。
另一方面,正如@FrankPavageau所说,您可以使用自己的ForwardingQueue
实现。一种天真的方法(有进一步优化的地方)将是这样的:
static class BoundedQueue<E> extends ForwardingQueue<E> {
private final Queue<E> delegate;
private final int capacity;
public BoundedQueue(final int capacity) {
this.delegate =
new ArrayDeque<E>(capacity); // specifying initial capacity is optional
this.capacity = capacity;
}
@Override
protected Queue<E> delegate() {
return delegate;
}
@Override
public boolean add(final E element) {
if (size() >= capacity) {
delegate.poll();
}
return delegate.add(element);
}
@Override
public boolean addAll(final Collection<? extends E> collection) {
return standardAddAll(collection);
}
@Override
public boolean offer(final E o) {
return standardOffer(o);
}
}
用法:
final BoundedQueue<Integer> boundedQueue = new BoundedQueue<Integer>(3);
boundedQueue.add(1);
System.out.println(boundedQueue); // [1]
boundedQueue.add(2);
System.out.println(boundedQueue); // [1, 2]
boundedQueue.add(3);
System.out.println(boundedQueue); // [1, 2, 3]
boundedQueue.add(4);
System.out.println(boundedQueue); // [2, 3, 4]
boundedQueue.addAll(Arrays.asList(5, 6, 7, 8));
System.out.println(boundedQueue); // [6, 7, 8]
((Queue<Integer>) boundedQueue).offer(9);
System.out.println(boundedQueue); // [7, 8, 9]
答案 3 :(得分:-2)
Java's ArrayBlockingQueue
提供固定大小的循环缓冲区。