privatevoidallocateElements(int numElements){
int initialCapacity = MIN_INITIAL_CAPACITY;
// Find the best power of two to hold elements.// Tests "<=" because arrays aren't kept full.if (numElements >= initialCapacity) {
initialCapacity = numElements;
initialCapacity |= (initialCapacity >>> 1);
initialCapacity |= (initialCapacity >>> 2);
initialCapacity |= (initialCapacity >>> 4);
initialCapacity |= (initialCapacity >>> 8);
initialCapacity |= (initialCapacity >>> 16);
initialCapacity++;
if (initialCapacity < 0) // Too many elements, must back off
initialCapacity >>>= 1;// Good luck allocating 2 ^ 30 elements
}
elements = (E[]) new Object[initialCapacity];
}
複製代碼
publicstaticinthighestOneBit(int i){
// HD, Figure 3-1
i |= (i >> 1);
i |= (i >> 2);
i |= (i >> 4);
i |= (i >> 8);
i |= (i >> 16);
return i - (i >>> 1);
}
複製代碼
privatevoiddoubleCapacity(){
assert head == tail;
int p = head;
int n = elements.length;
int r = n - p; // number of elements to the right of pint newCapacity = n << 1;
if (newCapacity < 0)
thrownew 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 = (E[])a;
head = 0;
tail = n;
}
複製代碼
Deque<String> queue = new ArrayDeque<>(7);
queue.addFirst("a");
queue.addFirst("b");
複製代碼
執行完後,內部結構會以下圖所示:
介紹完了添加,下面來看刪除。
從頭部刪除
removeFirst方法的代碼爲:
public E removeFirst(){
E x = pollFirst();
if (x == null)
thrownew NoSuchElementException();
return x;
}
複製代碼
pollFirst的代碼爲:
public E pollFirst(){
int h = head;
E result = elements[h]; // Element is null if deque emptyif (result == null)
returnnull;
elements[h] = null; // Must null out slot
head = (h + 1) & (elements.length - 1);
return result;
}
複製代碼
public E removeLast(){
E x = pollLast();
if (x == null)
thrownew NoSuchElementException();
return x;
}
複製代碼
pollLast的代碼爲:
public E pollLast(){
int t = (tail - 1) & (elements.length - 1);
E result = elements[t];
if (result == null)
returnnull;
elements[t] = null;
tail = t;
return result;
}
複製代碼
publicbooleancontains(Object o){
if (o == null)
returnfalse;
int mask = elements.length - 1;
int i = head;
E x;
while ( (x = elements[i]) != null) {
if (o.equals(x))
returntrue;
i = (i + 1) & mask;
}
returnfalse;
}
複製代碼