什么是ArrayDeque?
ArrayDeque是基于数组的双端队列,支持在队列的两端插入和删除元素。ArrayDeque的默认数组长度为16.
ArrayDeque扩容
ArrayDeque扩容时间点发生在head==tail时,由两端往中间进行双倍扩容,扩容代码如下。
private void doubleCapacity() {
assert head == tail;
int p = head;
int n = elements.length;
int r = n - p; // number of elements to the right of p
int newCapacity = n << 1;
if (newCapacity < 0)
throw new IllegalStateException("Sorry, deque too big");
Object[] a = new Object[newCapacity];
System.arraycopy(elements, p, a, 0, r);
System.arraycopy(elements, 0, a, r, p);
elements = a;
head = 0;
tail = n;
}
import java.util.ArrayDeque;
public class ArrayDequeTest {
public static void main(String[] args) {
ArrayDeque<String> arrayDeque = new ArrayDeque<>();
arrayDeque.offerFirst("孙悟空");
arrayDeque.offerFirst("唐僧");
arrayDeque.offerFirst("太上老君");
arrayDeque.offerLast("如来佛祖");
arrayDeque.offer("猪八戒");
arrayDeque.offerLast("沙僧");
System.out.println(arrayDeque.toString());
}
}
ArrayDeque首部、尾部插入过程
首部插入方法
- addFirst(E e)
- offerFirst(E e)
首部插入过程
ArrayDeque首部插入时,数据从数组的尾部开始插入,插入完成之后,首部指针前移,再次首部插入时,从首部指针处开始插入,首部指针前移,依次完成首部插入动作,此过程不需要移动已插入的数据,时间复杂度O(1),当尾部指针和首部指针重叠时,执行扩容动作。
尾部插入方法
- addLast(E e)
- offerLast(E e)
尾部插入过程
ArrayDeque尾部插入时,数据从数组的头部开始插入,插入完成之后,尾部指针后移,再次尾部插入时,从尾部指针处开始插入,尾部指针后移,依次完成尾部插入动作,此过程不需要移动已插入的数据,时间复杂度O(1),当尾部指针和首部指针重叠时,执行扩容动作。