关于队列这个数据结构,大家应该都是比较熟悉。列队是一种先进先出(FIFO)的数据结构。删除操作只能在表的头部,插入操作只能在表的尾部。
Queue一般是作为一个缓冲队列使用的,简单举例:生产端的生产速度偶尔会大于消费端的消费速度,但又不想等待对方,此时如果有个缓存队列这样的问题就解决啦。生产端生产的东西只管放入缓存队列,消费端从缓存队列里面拿东西,达到一个缓冲的目的。
LinkedList是基于链表来实现,ArrayQueue基于数组实现。下面我们会主要讲一下这ArrayQueue者的源码实现。
ArrayQueue
public class ArrayDeque<E> extends AbstractCollection<E>
implements Deque<E>, Cloneable, Serializable
{
//实际存放元素的数组
transient Object[] elements;
//头指针
transient int head;
//尾指针
transient int tail;
//默认最小容量
private static final int MIN_INITIAL_CAPACITY = 8;
}
ArrayQueue初始化
//未制定容量时,默认为16
public ArrayDeque() {
elements = new Object[16];
}
//制定初始容量
public ArrayDeque(int numElements) {
allocateElements(numElements);
}
//指定初始值
public ArrayDeque(Collection<? extends E> c) {
allocateElements(c.size());
addAll(c);
}
//指定容量小于8时,返回8
//否则,返回initialCapacity=2^n,2^n越界时,则取2^30
private void allocateElements(int numElements) {
int initialCapacity = MIN_INITIAL_CAPACITY;
if (numElements >= initialCapacity) {
initialCapacity = numElements;
initialCapacity |= (initialCapacity >>> 1);
initialCapacity |= (initialCapacity >>> 2);
initialCapacity |= (initialCapacity >>> 4);
initialCapacity |= (initialCapacity >>> 8);
initialCapacity |= (initialCapacity >>> 16);
initialCapacity++;