日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java集合Stack源码深入解析

發布時間:2025/3/20 java 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java集合Stack源码深入解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

概要

學完Vector了之后,接下來我們開始學習Stack。Stack很簡單,它繼承于Vector。學習方式還是和之前一樣,先對Stack有個整體認識,然后再學習它的源碼;最后再通過實例來學會使用它。

第1部分 Stack介紹

Stack簡介

Stack是棧。它的特性是:先進后出(FILO, First In Last Out)。

java工具包中的Stack是繼承于Vector(矢量隊列)的,由于Vector是通過數組實現的,這就意味著,Stack也是通過數組實現的,而非鏈表。當然,我們也可以將LinkedList當作棧來使用!在“Java 集合系列06之 Vector詳細介紹(源碼解析)和使用示例”中,已經詳細介紹過Vector的數據結構,這里就不再對Stack的數據結構進行說明了。

Stack的繼承關系

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的關系如下圖:

Stack的構造函數

Stack只有一個默認構造函數,如下:

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;// 構造函數public Stack() {}// push函數:將元素存入棧頂public E push(E item) {// 將元素存入棧頂。// addElement()的實現在Vector.java中addElement(item);return item;}// pop函數:返回棧頂元素,并將其從棧中刪除public synchronized E pop() {E obj;int len = size();obj = peek();// 刪除棧頂元素,removeElementAt()的實現在Vector.java中removeElementAt(len - 1);return obj;}// peek函數:返回棧頂元素,不執行刪除操作public synchronized E peek() {int len = size();if (len == 0)throw new EmptyStackException();// 返回棧頂元素,elementAt()具體實現在Vector.java中return elementAt(len - 1);}// 棧是否為空public boolean empty() {return size() == 0;}// 查找“元素o”在棧中的位置:由棧底向棧頂方向數public synchronized int search(Object o) {// 獲取元素索引,elementAt()具體實現在Vector.java中int i = lastIndexOf(o);if (i >= 0) {return size() - i;}return -1;} }

總結:

(01) Stack實際上也是通過數組去實現的。

執行`push`時(即,**將元素推入棧中**),是通過將元素追加的數組的末尾中。執行`peek`時(即,**取出棧頂元素,不執行刪除**),是返回數組末尾的元素。執行`pop`時(即,**取出棧頂元素,并將該元素從棧中刪除**),是取出數組末尾的元素,然后將該元素從數組中刪除。

(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();}}

運行結果:

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

文章有不當之處,歡迎指正,你也可以關注我的微信公眾號:好好學java,獲取優質學習資源。

總結

以上是生活随笔為你收集整理的Java集合Stack源码深入解析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。