Дуже цікавий проект - руйнівник. Він має буфер обміну та використовується з того, що я знаю у фінансових додатках.
Дивіться тут: код буфера обміну
Я перевірив як EvictingQueue від Guava, так і ArrayDeque.
ArrayDeque не обмежує зростання, якщо він повний, він збільшиться вдвічі і, отже, не точно діє як буфер обміну.
EvictingQueue робить те, що обіцяє, але внутрішньо використовує Deque для зберігання речей і просто обмежує пам’ять.
Отже, якщо ви піклуєтесь про обмеження пам’яті, ArrayDeque не виконує вашу обіцянку. Якщо ви дбаєте про кількість об'єктів, EvictingQueue використовує внутрішній склад (більший розмір об'єкта).
Простий і ефективний пам’ять можна викрасти у jmonkeyengine . дослівна копія
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
здається розумним вибором для вставлення та видалення O (1), вам також потрібна індексація O (1)?