特殊功能的循环队列
特点:
一.入队列不会满的情况下,会覆盖掉尾部的数据.
二.快速从尾部获取指定个数个数据.
代码:
public class LoopQueue<T> implements Serializable {
private static final long serialVersionUID = -3670496550272478781L;
private int DEFAULT_SIZE = 100;
private int capacity;
private Object[] elementData;
private int front = 0;
private int rear = 0;
public LoopQueue() {
capacity = DEFAULT_SIZE;
elementData = new Object[capacity];
}
public LoopQueue(T element) {
this();
elementData[0] = element;
rear++;
}
public LoopQueue(T element, int initSize) {
this.capacity = initSize;
elementData = new Object[capacity];
elementData[0] = element;
rear++;
}
public int size() {
if (isEmpty()) {
return 0;
}
return rear > front ? rear - front : capacity - (front - rear);
}
public void offer(T element) {
if (size() == capacity) {
front = rear + 1;
front = front == capacity ? 0 : front;
}
elementData[rear++] = element;
rear = rear == capacity ? 0 : rear;
}
public T poll() {
if (isEmpty()) {
return null;
}
@SuppressWarnings("unchecked")
T oldValue = (T) elementData[front];
elementData[front++] = null;
front = front == capacity ? 0 : front;
return oldValue;
}
@SuppressWarnings("unchecked")
public T element() {
if (isEmpty()) {
return null;
}
return (T) elementData[front];
}
public boolean isEmpty() {
return rear == front && elementData[rear] == null;
}
public void clear() {
Arrays.fill(elementData, null);
front = 0;
rear = 0;
}
public List<T> getElementsFormRear(int count) {
List<T> result = new ArrayList<>();
int min = size() < count ? size() : count;
int num = 0;
for (int i = rear - 1; num < min; i--) {
i = i < 0 ? capacity - 1 : i;
@SuppressWarnings("unchecked")
T t = (T) elementData[i];
result.add(t);
num++;
}
return result;
}
public static void main(String[] args) {
LoopQueue<Integer> loopQueue = new LoopQueue<>();
for (int i = 0; i < 80; i++) {
loopQueue.offer(i);
System.out.println(JsonUtil.ObjectToJsonString(loopQueue.getElementsFormRear(4)));
}
}
}