Java集合之ArrayDeque

302 阅读1分钟

什么是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;
    }

无标题.png

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());
    }
}

image.png

ArrayDeque首部、尾部插入过程

首部插入方法

  • addFirst(E e)
  • offerFirst(E e)

首部插入过程

ArrayDeque首部插入时,数据从数组的尾部开始插入,插入完成之后,首部指针前移,再次首部插入时,从首部指针处开始插入,首部指针前移,依次完成首部插入动作,此过程不需要移动已插入的数据,时间复杂度O(1),当尾部指针和首部指针重叠时,执行扩容动作。

尾部插入方法

  • addLast(E e)
  • offerLast(E e)

尾部插入过程

ArrayDeque尾部插入时,数据从数组的头部开始插入,插入完成之后,尾部指针后移,再次尾部插入时,从尾部指针处开始插入,尾部指针后移,依次完成尾部插入动作,此过程不需要移动已插入的数据,时间复杂度O(1),当尾部指针和首部指针重叠时,执行扩容动作。