Stack-棧的源碼分析與實現

一,Stack源碼分析

Stack,棧,也是數據結構的一種,對於java應用開發者而言,我使用棧的應用場景比較少,通常作作算法類的題會用到,對於實際的應用場景我以爲棧仍是比較厲害的一種數據結構,棧的特色嘛,先進後出,後進先出。java

二,方法分析

其實,怎麼說呢,我分析過了Vector集合的源碼分析了,然而棧繼承了Vector類,因此,你懂得,棧就是Vector集合的一種特例了,因此,這篇文章會很簡短,可是我仍是來分析了。web

Vector集合最全面的源碼分析
算法

2.1,棧結構繼承結構

//記住和理解java類的"單繼承,多實現"的特色哈
public class Stack<E> extends Vector<E> {}

2.2,構造函數

//一個無參構造函數
public Stack() {
}

2.3,push()方法

其實,棧也是看做一種集合嘛,集合就是用來裝填數據元素的嘛,因此咱們接下來就是分析棧的各類方法了,如何裝填數據元素呢,固然了,咱們要看下push()方法了。數組

public E push(E item) {
//看下第二步操做
addElement(item);

return item;
}
//第二步操做
public synchronized void addElement(E obj) {
//modCount的含義下面的這個解釋已經很形象了
//The number of times this list has been modified
modCount++;
//這一步就是擴容操做了,這裏不分析了,能夠看下vector源碼分析這篇文章
ensureCapacityHelper(elementCount + 1);
//將元素裝填在數組中
elementData[elementCount++] = obj;
}

2.4,pop()方法

public synchronized E pop() {
E obj;
//第二步操做,獲取棧的大小
int len = size();
//第三步操做,調用peek()方法獲取棧頂元素位置
obj = peek();
//第四步操做,將棧頂的元素刪除,就達到了pop()的功能
//等下一塊兒分析下peek()方法
removeElementAt(len - 1);

return obj;
}
//第二步操做
public synchronized int size() {
//這是一個線程安全的方法,返回集合元素的個數,成員變量elementCount
return elementCount;
}
//第四步操做
public synchronized void removeElementAt(int index) {
//其實,這個不用太關心了
modCount++;
//首先,咱們刪除一個元素的時候,會先判斷是否存在這個元素的
//這裏index=len-1就是數組空間的最後一個元素
if (index >= elementCount) {
throw new ArrayIndexOutOfBoundsException(index + " >= " +
elementCount);
}
//數組空間的起始位置是從0開始的,因此小於0,就須要拋出索引越界的問題
else if (index < 0) {
throw new ArrayIndexOutOfBoundsException(index);
}
//肯定j的位置,便於數組元素的移動
int j = elementCount - index - 1;
if (j > 0) {
System.arraycopy(elementData, index + 1, elementData, index, j);
}
//集合元素個數減一
elementCount--;
//將移除的元素置爲null,和下面註釋表達的同樣的,就是爲了觸發gc來回收不可達對象的
//以便整合內存空間
elementData[elementCount] = null; /* to let gc do its work */
}

2.5,peek()方法

public synchronized E peek() {
//獲取集合元素個數
int len = size();
//集合個數長度爲0時,再去獲取元素時就應該拋出棧爲空的異常
if (len == 0)
throw new EmptyStackException();
return elementAt(len - 1);
}
//第二步操做
public synchronized E elementAt(int index) {
//校驗索引是否越界
if (index >= elementCount) {
throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount);
}
//根據索引下標位置獲取指定位置的元素
return elementData(index);
}
//第三步操做
E elementData(int index) {
return (E) elementData[index];
}

2.6,isEmpty()方法

public boolean empty() {
//判斷集合size是否等於0
return size() == 0;
}

2.7,search()方法

public synchronized int search(Object o) {
int i = lastIndexOf(o);

if (i >= 0) {
return size() - i;
}
return -1;
}
//第二步操做
public synchronized int lastIndexOf(Object o) {
return lastIndexOf(o, elementCount-1);
}
//第三步操做
public synchronized int lastIndexOf(Object o, int index) {
//預檢查機制
if (index >= elementCount)
throw new IndexOutOfBoundsException(index + " >= "+ elementCount);
//其實,集合是能夠裝填null元素的,因此這裏須要區分,時間複雜度爲O(n)
if (o == null) {
for (int i = index; i >= 0; i--)
if (elementData[i]==null)
return i;
} else {
for (int i = index; i >= 0; i--)
if (o.equals(elementData[i]))
return i;
}
return -1;
}

三,總結一下

總結一下了,棧的特色,後進先出,方法和實現上都基於vector原有的方法基礎上所作的,對於這篇集合源碼,本身沒有很想說的內容了,這裏就不過多說了,喜歡的不妨分享一下吧,感謝安全


本文分享自微信公衆號 - WwpwW(gh_245290c1861a)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。微信

相關文章
相關標籤/搜索