java集合容器之Stack

2021-01-07 愚公要移山1

這篇文章開始介紹Stack。從名字看他就是一個stack,因此具有數據結構中棧的一般特性(後進先出),平時用起來相對較多一點,但是也是非常簡單。這篇文章我們將從源碼的角度來分析一下Stack。

OK,開始今天的文章。

一、認識Stack

Stack繼承自Vector。底層是通過數組實現的。下面我們認識一下Stack在整個java集合體系中的位置:

我們會發現,其實Stack就是繼承自Vector,因此它具有Vector的一般特點。我們把Stack放大,從Stack的角度來看一下:

從上圖我們可以看到,Stack其實就是繼承了Vector,Vector具有的接口的父類,Stack也有。

繼承了AbstractList、實現了Enumeration、List、ListIterator等接口。

下面我們再來看一下源碼,它的源碼那是超級簡單。

二、源碼分析

一下源碼基於jdk1.8來分析的。

(1)構造方法

publicStack(){}

只有一個無參構造方法。

(2)增加元素

這裡面調用了addElement方法,我們追蹤進去,繼續往裡看

synchronized 說明了這是一個線程安全的方法,他分了三步走的戰略:

第一步:它在添加元素的時候首先將modCount加1,保證線程安全。第二步:ensureCapacityHelper()主要用於保障Stack的容量,在合理範圍第三步:真正實現元素的添加,將該元素添加到棧頂,數目加1;(3)刪除元素

在這裡我們發現,真正實現刪除操作的是removeElementAt;我們追蹤進去:

synchronized 說明了這是一個線程安全的方法,刪除操作就有點複雜了,沒關係我們繼續分析:

第一步:它在添加元素的時候首先將modCount加1,保證線程安全。第二步:第一個if判斷刪除元素是否超出了存儲的數量範圍第三步:第二個if判斷待刪除的元素下標大於0第四步:第三個if將元素後移第五步:將數量減小1第六步:將最上面的元素置為空,也就是刪除了元素。(4)查找操作

在上面刪除的時候我們發現了其實有一個peek()方法我們沒有將,他的作用就是返回stack中最頂端的元素。

但是還有一個最正式的查找操作:

該方法返回所查找對象所處的位置,如果不存在在返回-1;

第一步:通過lastLindexOf(Object)方法返回從棧底到棧頂最下面的的那個元素的下標,第二步:利用元素的總數目減去所處的下標就得到了元素的位置(),並且返回否則返回-1;(5)其他方法

這裡提供的其他方法只有一個判斷是否為空

以上就列出了Stack的所有源碼,超級簡單。最後我們就來對它進行有一個總結

三、總結

stack是繼承自Vector,底層使用數組存儲、用來模擬棧的一個java集合。同時也是線程安全的。使用場景比如說倒序輸出、XML語法檢查。最主要的是面試還經常使用到它,因此你主要還是在機試的時候靈活的去使用它。

相關焦點

  • StackOverflow 上面最流行的 7 個 Java 問題!
    二、Java中的安全問題連結:http://stackoverflow.com/questions/8881291/why-is-char-preferred-over-string-for-passwords-in-java另一個流行的Java問題是:為什麼在Java中有關密碼的地方更加喜歡使用char[]而不是String?
  • StackOverflow 上面最流行的 7 個 Java 問題!| 值得一看
    一、分支預測問題連結:https://stackoverflow.com/questions/11227809/why-is-it-faster-to-process-a-sorted-array-than-an-unsorted-arrayStackOverflow上最多投票的一個
  • java中棧(stack)堆(heap)靜態區(static area)概念
    對於java的這3大區域了解下還是有必要的,尤其是對jvm調優,更應該理解下它們的概念。存儲的全部是對象,每個對象都包含一個與之對應的class的信息。棧(stack):對象實例在heap 中分配好以後,需要在stack中保存一個4位元組的heap內存地址,用來定位該對象實例在heap 中的位置,便於找到該對象實例。
  • Stackoverflow問答:Java是傳值還是傳引用?
    來自:並發編程網 - ifeve.com原文:http://stackoverflow.com
  • JVM之用Java解析class文件
    來自:半棧工程師,個人博客:https://halfstackdeveloper.github.io連結:https://halfstackdeveloper.github.io
  • Java Thread 那些事
    OK,在簡單介紹完幾個重點的線程狀態後,我們通過幾個具體的case來了解下Thread stack:Case 1:NIO 中的Acceptor "qtp589745448-36 Acceptor0 SelectChannelConnector@0.0.0.0:8161" prio=10 tid=0x00007f02f8eea800
  • 重學Java 設計模式:實戰外觀模式
    場景模擬工程itstack-demo-design-10-00└── src ├── main │ ├── java │ │ └── org.itstack.demo.design │ │ ├
  • 從1+1=2來理解Java字節碼
    stack=2, locals=2, args_size=1 0: iconst_2 1: istore_1 2: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream; 5: iload_1 6: invokevirtual
  • StackOverflow:7個你從未見過的Java問題最佳答案
    Date sDt3 = sf.parse(str3); Date sDt4 = sf.parse(str4); long ld3 = sDt3.getTime() /1000; long ld4 = sDt4.getTime() /1000; System.out.println(ld4-ld3);}Java version:java
  • StackOverflow Java API 問題 Top10
    }如果我們在 jExample 上搜索 「HashMap」 並跳轉到 java.util.HashMap 的示例頁面。採納的答案給出的解決方法是:int randomNum = rand.nextInt((max - min) + 1) + min;如果我們查看 java.util,Random 類的頁面,我們也能夠找到一種類似的方法:
  • Java 數據持久化系列之 HikariCP
    更加遵循 JDBC 規範,在關閉 Connection 之前先關閉與之關聯的 Statement 和ResultSet 等。對 JDBC 不了解的同學可以閱讀本系列中第一篇文章。對於資料庫連接中斷的情況,HikariCP 也處理的更加出色。
  • java集合詳解合集
    ();//依次將三個元素push入"棧"stack.push("瘋狂Java講義");stack.push("輕量級Java EE企業應用實戰");stack.push("瘋狂Android講義");/
  • Gradle 創建java項目詳細步驟
    需要java 1.7 以上版本選擇gradle 4.3 以上版本本文推薦java 1.8 +Gradle 5.4Windows用戶下載安裝包:https://gradle.org/next-steps/?
  • java.lang.String 的 + 號操作到底做了什麼?
    /string/test/Main  #48 = Utf8               java/lang/Object  #49 = Utf8               java/lang/String  #50 = Utf8               java/io/PrintStream  #51 = Utf8               append
  • java.lang.String 的 + 號操作,這個謎終於要解開了!
    /string/test/Main  #48 = Utf8               java/lang/Object  #49 = Utf8               java/lang/String  #50 = Utf8               java/io/PrintStream  #51 = Utf8               append
  • Java學習必不可少的十大網站
    這是我為學習java的同學們準備的網站集合。這些網站提供新聞,常見問題或訪談問題的答案,精彩的講座等。質量是好的網站的關鍵因素。我認為它們都具有最高的質量。在下文中,我還將分享如何使用這些網站進行學習或娛樂。1.
  • 獨家內推 | Servian Java Fullstack Developer正在熱招!
    This is a great opportunity for Full stack Java enthusiasts to join a consulting firm that offers a variety of projects and a structured learning and development path.
  • Java 中關於 try、catch、finally 中的細節分析
    作者:God Is Coderhttps://www.cnblogs.com/aigongsi看了一位博友的一篇文章,講解的是關於java中關於try、catch、finally中一些問題下面看一個例子(例1),來講解java裡面中try、catch、finally的處理流程public class TryCatchFinally {    @SuppressWarnings("finally
  • 乾貨 | JAVA調用cplex求解一個TSP模型詳解
    其中:在app包中:App.java:程序入口,cplex調用建模求解過程。ConstraintFactory.java:控制子環約束的。FileManager.java:讀取instance數據的。在graph包中,定義了一些求解過程所需要的數據結構。
  • 重學Java 設計模式:實戰命令模式「模擬高檔餐廳八大菜系,小二點單...
    工程結構itstack-demo-design-14-01└── src └── main └── java └── org.itstack.demo.design └──