Un proyecto muy interesante es disruptor. Tiene un búfer de anillo y se usa por lo que sé en aplicaciones financieras.
Ver aquí: código de ringbuffer
Revisé EvictingQueue y ArrayDeque de Guava.
ArrayDeque no limita el crecimiento si está lleno, duplicará su tamaño y, por lo tanto, no actúa precisamente como un búfer de anillo.
EvictingQueue hace lo que promete pero usa internamente un Deque para almacenar cosas y limitar la memoria.
Por lo tanto, si le importa que la memoria esté limitada, ArrayDeque no está cumpliendo su promesa. Si le importa el recuento de objetos, EvictingQueue usa una composición interna (tamaño de objeto más grande).
Se puede robar uno simple y eficiente en memoria de jmonkeyengine . copia literal
import java.util.Iterator;
import java.util.NoSuchElementException;
public class RingBuffer<T> implements Iterable<T> {
private T[] buffer;
private int count = 0;
private int indexOut = 0;
private int indexIn = 0;
public RingBuffer(int capacity) {
buffer = (T[]) new Object[capacity];
}
public boolean isEmpty() {
return count == 0;
}
public int size() {
return count;
}
public void push(T item) {
if (count == buffer.length) {
throw new RuntimeException("Ring buffer overflow");
}
buffer[indexIn] = item;
indexIn = (indexIn + 1) % buffer.length;
count++;
}
public T pop() {
if (isEmpty()) {
throw new RuntimeException("Ring buffer underflow");
}
T item = buffer[indexOut];
buffer[indexOut] = null;
count--;
indexOut = (indexOut + 1) % buffer.length;
return item;
}
public Iterator<T> iterator() {
return new RingBufferIterator();
}
private class RingBufferIterator implements Iterator<T> {
private int i = 0;
public boolean hasNext() {
return i < count;
}
public void remove() {
throw new UnsupportedOperationException();
}
public T next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
return buffer[i++];
}
}
}
LinkedList
parece una opción razonable para las inserciones y eliminaciones O (1), ¿también necesita la indexación O (1)?