package test01.queue; import java.util.Arrays; import java.util.Collection; /** * <p> * structure for queue * </p> * <p> * 用1个数组存数据,数组 小index 是 head,大index是tail,<br /> * 插入在 tail 处,删除在 head 处, * </p> * * @author eric * @param <E> */ public class Queue<E> { /** 初始容量 */ public static final int DEFAULT_SIZE = 10; /** 容量不足时翻倍数 */ public static final float DEFAULT_INCREMENT = 1.5f; /** 数据 */ private Object[] elementData; /** 元素个数 */ private int elementCount; /** 数组的头部,即 下次删除数据的 index */ private int head; /** 数组的尾部,即 下次插入数据的 index */ private int tail; public Queue() { this(DEFAULT_SIZE); } public Queue(int size) { this.elementData = new Object[size]; this.elementCount = 0; this.head = 0; this.tail = 0; } public Queue(Object[] data) { this.elementData = data; this.elementCount = data.length; this.head = 0; this.tail = 0; } public Queue(Collection<? extends E> c) { this(c.toArray()); } /** * 添加数据 到尾部 * * @param ele * @return */ public synchronized E add(E ele) { if (tail >= elementData.length) { adjustData(); } elementData[tail] = ele; elementCount++; tail++; return ele; }; /** * 删除数据 从头部 * * @return */ @SuppressWarnings("unchecked") public synchronized E remove() { E e = (E) elementData[head]; elementData[head] = null; elementCount--; head++; return e; }; /** * 获得当前的数据 * * @return */ public synchronized Object[] getData() { return Arrays.copyOfRange(this.elementData, this.head, this.tail); } public synchronized void adjustData() { if (tail >= elementData.length) { // tail 处空间不足时调用 // head 的空位去掉 int newSize = (elementData.length == elementCount) ? (int) Math.ceil(elementCount * DEFAULT_INCREMENT) : elementData.length; elementData = Arrays.copyOfRange(elementData, head, elementData.length); // 调整空间 elementData = Arrays.copyOf(elementData, newSize); tail = elementCount; head = 0; } } }