《學習記錄》Queue原始碼學習

2021-07-28 10:03:11 字數 1887 閱讀 6183

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...