参考文章:JCFInternals
环境:JDK1.9
介绍:
ArrayDeque 实现了Deque接口,它既可以当作栈使用,也可以当作队列使用,底层实现是循环数组,未实现同步,无法存储null元素
实现功能:
- size() :获取当前元素个数
- addFirst(T element):在集合首端插入元素
- addLast(T element):在集合尾端插入元素
- pollFirst(): 删除并返回集合首端元素
- pollLast(): 删除并返回集合尾端元素
- peekFirst():返回集合首端元素
- peekLast():返回集合尾端元素
import java.lang.annotation.ElementType;
public class MyArrayDeque<T> {
private Object[] elementData;
private int head;
private int tail;
MyArrayDeque() {
elementData = new Object[16];
}
public int size() {
return (tail - head + elementData.length) & (elementData.length - 1);
}
// 在集合首端插入元素
public void addFirst(T element) {
// 不允许放 null
if (element == null) {
throw new NullPointerException();
}
// head 前移一位放 element
elementData[head = ((head - 1) & (elementData.length - 1))] = element;
// 满了,扩容
if (head == tail) {
grow();
}
}
// 在集合尾端插入元素
public void addLast(T element) {
// 不允许放 null
if (element == null) {
throw new NullPointerException();
}
elementData[tail] = element;
// 如果满了,扩容
if ((tail = (tail + 1) & (elementData.length - 1)) == head) {
grow();
}
}
// 删除并返回集合首端元素
public T pollFirst() {
T res = (T) elementData[head];
// 如果 res 是null,意味着此时集合为空
if (res == null) {
return null;
}
elementData[head] = null;
head = ((head + 1) & (elementData.length - 1));
return res;
}
// 删除并返回集合尾端元素
public T pollLast() {
int t = (tail - 1) & (elementData.length - 1);
T res = (T) elementData[t];
// 如果 res 是null,意味着此时集合为空
if (res == null) {
return null;
}
elementData[t] = null;
tail = t;
return res;
}
public T peekFirst() {
return (T) elementData[head];
}
public T peekLast() {
return (T) elementData[(tail - 1) & (elementData.length - 1)];
}
private void grow() {
int p = head;
int n = elementData.length;
// head右边元素个数
int r = n - p;
// 扩容一倍
int newCapacity = n << 1;
if (newCapacity < 0) {
throw new IllegalStateException("Sorry, deque too big");
}
Object[] a = new Object[newCapacity];
// 将 [head,elementData.length) 的值复制到新数组的开头
System.arraycopy(elementData, p, a, 0, r);
// 将 [0,head) 的值复制到新数组的后面
System.arraycopy(elementData, 0, a, r, p);
elementData = (T[]) a;
head = 0;
tail = n;
}
}