transient object elements;
transient int head;
transient int tail;
public arraydeque()
public arraydeque(int numelements)
調整陣列長度:
private void allocateelements(int numelements)
elements = new object[initialcapacity];
}
解析:根據特定引數設定初始陣列的大小。中間移位和或操作是將initialcapacity左邊最高位的1複製到右邊,再加1變成2的冪次方。
private void doublecapacity()
解析:這個陣列長度擴充套件,當元素個數增長到等於陣列大小時(head==tail),此時將陣列大小擴充一倍,再使用arraycopy將元素複製到新的陣列。arraycopy(src,srcpos,dest,destpos,length),src指原陣列,srcpos指數組複製的開始位置,dest指目的陣列,destpos指目的陣列的起始位置,length指要複製的長度。
public void addfirst(e e)
public void addlast(e e)
public boolean offerfirst(e e)
public boolean offerlast(e e)
新增是將新的元素新增到隊頭或者隊尾,add和offer的功能實現是一樣的。因為已經初始化了陣列大小,出頭元素時head往後移動,如尾元素時tail往後移動,當移動到陣列最後時,會將head或者tail迴圈到陣列的前面。所以head = (head - 1) & (elements.length - 1)
的功能相當於head = (head - 1) %(element.length - 1)
由於tail指向的是隊尾的後一位,所以先入隊尾,再(tail = (tail + 1) & (elements.length - 1)
功能相當於tail = (tail + 1) % (elements.length - 1)
當tail==head時,說明元素已滿,所以要擴充陣列大小,並使用arraycopy拷貝陣列。
public e removefirst()
public e removelast()
public e pollfirst()
public e polllast()
head = (h + 1) & (elements.length - 1);
出隊尾元素,將最後乙個元素為null,tail指向前乙個位置。t = (tail - 1) & (elements.length - 1);
public e getfirst()
public e getlast()
public e peekfirst()
public e peeklast()
解析:peek和get的方法實現一樣。主要是獲取頭元素和尾元素的陣列下標。 Queue 原始碼閱讀
僅大致過了下,有問題的請指出,謝謝。1.8佇列介面,抽象實現,優先順序佇列 雙端佇列介面,雙端佇列實現 deque public inte ce queue extends collection public abstract class abstractqueue extends abstract...
學習httpbin原始碼記錄 三
我在閱讀httpbin源 的時候遇到了很多不理解的細節問題,然後就想最好的方法當然就是修改原始碼,然後去執行它 後來經過嘗試,我突然明白過來httpbin發布到github上的原始碼是以package的形式,而我不能直接執行package 因為package中存在多處相對引用,使得不能像執行乙個mo...
STL原始碼剖析學習記錄 一
stl六大元件 1.容器 containers 如vector,list,set,map,從實現角度來看stl容器是一種類模板 class template 2.演算法 algorithms 如sort,search,copy,erase.從實現的角度來講stl演算法是一種函式模板 function...