Ein sehr interessantes Projekt ist Disruptor. Es hat einen Ringpuffer und wird von dem verwendet, was ich in Finanzanwendungen weiß.
Siehe hier: Code des Ringpuffers
Ich habe sowohl Guavas EvictingQueue als auch ArrayDeque überprüft.
ArrayDeque begrenzt das Wachstum nicht, wenn es voll ist, verdoppelt es seine Größe und verhält sich daher nicht genau wie ein Ringpuffer.
EvictingQueue hält, was es verspricht, verwendet jedoch intern eine Deque, um Dinge zu speichern, und begrenzt nur den Speicher.
Wenn Sie also Wert darauf legen, dass der Speicher begrenzt wird, erfüllt ArrayDeque Ihr Versprechen nicht. Wenn Sie sich für die Anzahl der Objekte interessieren, verwendet EvictingQueue die interne Komposition (größere Objektgröße).
Ein einfacher und speichereffizienter kann von jmonkeyengine gestohlen werden . wörtliche Kopie
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
scheint eine vernünftige Wahl für O (1) -Einfügungen und -Entfernungen zu sein. Benötigen Sie auch eine O (1) -Indizierung?