Java中的Vector和Stack底層源碼分析
一. 基本原理和優(yōu)缺點
Stack繼承了Vector,Vector底層還是一個List,也就是基于數(shù)組來實現(xiàn)的,所以ArrayList有的優(yōu)點,比如獲取元素的速度快,隨機讀,它都有,與此相對的,ArrayList的缺點,比如從中間插入一個元素,從中間刪除一個元素,Stack也存在。
但是呢,Stack使用最多的方法就是push和pop,換句話說,Stack的作者并非希望我們把使用ArrayList的那一套,直接放到Stack上做。
如果嚴(yán)格按照push和pop來執(zhí)行,就可以避免中間操作元素時,產(chǎn)生移動元素的后果了。當(dāng)然了,頻繁向Stack push元素,仍然可能導(dǎo)致擴容。
棧和隊列(LinkedList)的實現(xiàn)有所不同,棧是"后進(jìn)先出",而隊列是"尾進(jìn)頭出"。
二. 源碼分析
2.1 push
Stack底層與ArrayList非常相似,存儲數(shù)據(jù)的容器是數(shù)組。
public E push(E item) { addElement(item); return item; }
public synchronized void addElement(E obj) { modCount++; ensureCapacityHelper(elementCount + 1); elementData[elementCount++] = obj; }
private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); elementData = Arrays.copyOf(elementData, newCapacity); }
代碼邏輯與ArrayList基本上一樣。
首先,判斷新增一個元素后,當(dāng)前的容器能否放得下這么多數(shù)據(jù),如果放不下,就要進(jìn)行擴容。擴容無外乎就是在原有容器的基礎(chǔ)上,擴大成1.5倍,如果還是放不下元素,則按照能夠容納新元素的最小大小,作為新容器的大小。只要涉及到擴容,肯定就會使用Arrays.copyOf()。
接著,就是往指定下標(biāo)的位置,加入新元素。
2.2 pop
彈出棧頂元素。
public synchronized E pop() { E obj; int len = size(); obj = peek(); removeElementAt(len - 1); return obj; }
所謂的棧頂元素,不就是當(dāng)前數(shù)組中最后一個元素么,它的下標(biāo)就是size-1,所以取出來就好啦。
三. 總結(jié)
Stack這個數(shù)據(jù)結(jié)構(gòu)非常的簡單,只要看過ArrayList的源碼,再看Stack,2分鐘就看完了。
使用棧時,用的最多的就是它"后進(jìn)先出"的數(shù)據(jù)結(jié)構(gòu)了。
到此這篇關(guān)于Java中的Vector和Stack底層源碼分析的文章就介紹到這了,更多相關(guān)Vector和Stack底層源碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java JTree JCheckBox樹復(fù)選框詳解
這篇文章主要為大家詳細(xì)介紹了java JTree JCheckBox樹復(fù)選框的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11SpringCache緩存抽象之CacheManager與自定義鍵生成方式
本文將深入探討Spring Cache的核心組件CacheManager及自定義鍵生成策略,幫助開發(fā)者掌握緩存配置與優(yōu)化技巧,從而構(gòu)建高效可靠的緩存系統(tǒng),希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-04-04SpringBoot?自定義starter?yaml提示失效問題及解決方法
在自定義starter后,必不可少會有properties配置參數(shù)需要指定,而在有時又不知道為什么出現(xiàn)這個問題,這篇文章主要介紹了SpringBoot?自定義starter?yaml提示失效問題,需要的朋友可以參考下2022-12-12Java中如何利用Set判斷List集合中是否有重復(fù)元素
在開發(fā)工作中,我們有時需要去判斷List集合中是否含有重復(fù)的元素,這時候我們不需要找出重復(fù)的元素,我們只需要返回一個?Boolean?類型就可以了,下面通過本文給大家介紹Java中利用Set判斷List集合中是否有重復(fù)元素,需要的朋友可以參考下2023-05-05