以前看了其餘實現Deque接口的類,這裏再看看ArrayDeque吧,下圖能夠看到這個類設計的結構層次,其實Deque接口是繼承了Queue接口的。用可調整大小的數組實現Deque接口。沒有容量限制,他們根據須要增加以支持使用。它們不是線程安全的,在沒有外部同步的狀況下,它們不支持多線程的併發訪問。禁止使用空元素。數組
大多數ArrayDeque操做以常量時間運行。例外包括remove,removeFirstOccurrence,removeLastOccurrence,contains,iterator.remove()和一些批量操做,全部這些都以線性時間運行。安全
此類有三個構造函數,以下圖:多線程
ArrayDeque():構造一個空數組deque,其初始容量16個元素。併發
ArrayDeque(int numElements):構造一個空數組deque,其初始容量足以容納指定數量的元素。函數
ArrayDeque(Collection<? extends E> c):按照集合的迭代器返回的順序構造一個包含指定集合元素的雙端隊列。工具
ArrayDeque中的字段主要有 transient Object[] elements,transient int head;,transient int tail;這裏看到就是修飾詞都是transient,表示類實現了序列化接口,可是該敏感詞彙不會被序列化。elements是用來存儲元素的;head表示隊列的頭部,pop()和remove()操做的元素;tail表示下一個元素要添加的位置,好比push(),add()和addLast()要增長的元素。測試
calculateSize和名字表述同樣,用於調整隊列容量的使用工具,可是有個限制就是2 ^ 30個元素,註釋寫的頗有趣"good luck"。線程
還有一種擴容測試是變爲原來的兩倍,這邊若是容量太大,會報「sorry,deque too big」的IllegalStateException異常,能夠看到擴容就要複製一份原來的元素,這個仍是比較消耗資源的。複製這裏用的都是 public static native void arraycopy(Object src, int srcPos,Object dest, int destPos,int length);設計
在此雙端隊列的前面插入指定的元素,addFirst(E e)。這裏由於是使用數組,因此增長隊首元素的時候,須要判斷元素在的位置,經過移動head的位置,elements[head = (head - 1) & (elements.length - 1)],這與咱們正常看到的隊列的第一個元素概念不一樣。若是head與tail指向了同一個位置,就須要擴容啦。3d
addLast(E e):在此雙端隊列的末尾插入指定的元素。這個與addfist相似,就是要判斷隊尾的位置,而後是否擴容。
而後咱們看看pollFisrt(),將head位置的元素置爲空,而後head+1的位置設置爲隊首,這裏藉助了一個變量h;後面的pollLast也是相似的,取tail前一個元素的位置。相似的,getFirst()和getLast()也是經過相同的方式,獲取元素。
這裏判斷size和empty的方式也能夠看看,size是經過tail和head的差值計算,雖然多是負數,可是與length-1作了與操做。empty的判斷比較簡單,就是比較head和tail是否相等。
這裏麻煩一點的就是delete操做了,刪除某個位置的元素,由於這裏按照head和tail的位置,移動tail或者head的位置。