Java集合Stack源码深入解析
概要
學完Vector了之后,接下來我們開始學習Stack。Stack很簡單,它繼承于Vector。學習方式還是和之前一樣,先對Stack有個整體認識,然后再學習它的源碼;最后再通過實例來學會使用它。
第1部分 Stack介紹
Stack簡介
Stack是棧。它的特性是:先進后出(FILO, First In Last Out)。
java工具包中的Stack是繼承于Vector(矢量隊列)的,由于Vector是通過數(shù)組實現(xiàn)的,這就意味著,Stack也是通過數(shù)組實現(xiàn)的,而非鏈表。當然,我們也可以將LinkedList當作棧來使用!在“Java 集合系列06之 Vector詳細介紹(源碼解析)和使用示例”中,已經(jīng)詳細介紹過Vector的數(shù)據(jù)結(jié)構(gòu),這里就不再對Stack的數(shù)據(jù)結(jié)構(gòu)進行說明了。
Stack的繼承關(guān)系
java.lang.Object ? java.util.AbstractCollection<E>? java.util.AbstractList<E>? java.util.Vector<E>? java.util.Stack<E>public class Stack<E> extends Vector<E> {}Stack和Collection的關(guān)系如下圖:
Stack的構(gòu)造函數(shù)
Stack只有一個默認構(gòu)造函數(shù),如下:
Stack()Stack的API
Stack是棧,它常用的API如下:
boolean empty() synchronized E peek() synchronized E pop()E push(E object) synchronized int search(Object o)由于Stack和繼承于Vector,因此它也包含Vector中的全部API。
第2部分 Stack源碼解析(基于JDK1.6.0_45)
Stack的源碼非常簡單,下面我們對它進行學習。
package java.util;public class Stack<E> extends Vector<E> {// 版本ID。這個用于版本升級控制,這里不須理會!private static final long serialVersionUID = 1224463164541339165L;// 構(gòu)造函數(shù)public Stack() {}// push函數(shù):將元素存入棧頂public E push(E item) {// 將元素存入棧頂。// addElement()的實現(xiàn)在Vector.java中addElement(item);return item;}// pop函數(shù):返回棧頂元素,并將其從棧中刪除public synchronized E pop() {E obj;int len = size();obj = peek();// 刪除棧頂元素,removeElementAt()的實現(xiàn)在Vector.java中removeElementAt(len - 1);return obj;}// peek函數(shù):返回棧頂元素,不執(zhí)行刪除操作public synchronized E peek() {int len = size();if (len == 0)throw new EmptyStackException();// 返回棧頂元素,elementAt()具體實現(xiàn)在Vector.java中return elementAt(len - 1);}// 棧是否為空public boolean empty() {return size() == 0;}// 查找“元素o”在棧中的位置:由棧底向棧頂方向數(shù)public synchronized int search(Object o) {// 獲取元素索引,elementAt()具體實現(xiàn)在Vector.java中int i = lastIndexOf(o);if (i >= 0) {return size() - i;}return -1;} }總結(jié):
(01) Stack實際上也是通過數(shù)組去實現(xiàn)的。
執(zhí)行`push`時(即,**將元素推入棧中**),是通過將元素追加的數(shù)組的末尾中。執(zhí)行`peek`時(即,**取出棧頂元素,不執(zhí)行刪除**),是返回數(shù)組末尾的元素。執(zhí)行`pop`時(即,**取出棧頂元素,并將該元素從棧中刪除**),是取出數(shù)組末尾的元素,然后將該元素從數(shù)組中刪除。(02) Stack繼承于Vector,意味著Vector擁有的屬性和功能,Stack都擁有。
第3部分 Vector示例
下面我們通過實例學習如何使用Stack
import java.util.Stack; import java.util.Iterator; import java.util.List;/*** @desc Stack的測試程序。測試常用API的用法** @author skywang*/ public class StackTest {public static void main(String[] args) {Stack stack = new Stack();// 將1,2,3,4,5添加到棧中for(int i=1; i<6; i++) {stack.push(String.valueOf(i));}// 遍歷并打印出該棧iteratorThroughRandomAccess(stack) ;// 查找“2”在棧中的位置,并輸出int pos = stack.search("2");System.out.println("the postion of 2 is:"+pos);// pup棧頂元素之后,遍歷棧stack.pop();iteratorThroughRandomAccess(stack) ;// peek棧頂元素之后,遍歷棧String val = (String)stack.peek();System.out.println("peek:"+val);iteratorThroughRandomAccess(stack) ;// 通過Iterator去遍歷StackiteratorThroughIterator(stack) ;}/*** 通過快速訪問遍歷Stack*/public static void iteratorThroughRandomAccess(List list) {String val = null;for (int i=0; i<list.size(); i++) {val = (String)list.get(i);System.out.print(val+" ");}System.out.println();}/*** 通過迭代器遍歷Stack*/public static void iteratorThroughIterator(List list) {String val = null;for(Iterator iter = list.iterator(); iter.hasNext(); ) {val = (String)iter.next();System.out.print(val+" ");}System.out.println();}}運行結(jié)果:
1 2 3 4 5 the postion of 2 is:4 1 2 3 4 peek:4 1 2 3 4 1 2 3 4 出處:http://www.cnblogs.com/skywan...文章有不當之處,歡迎指正,你也可以關(guān)注我的微信公眾號:好好學java,獲取優(yōu)質(zhì)學習資源。
總結(jié)
以上是生活随笔為你收集整理的Java集合Stack源码深入解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IOS上的 Audio Memos SE
- 下一篇: 学习自然语言处理,一张图就够了