溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何進(jìn)行Vector源碼解析

發(fā)布時(shí)間:2021-12-27 17:24:39 來(lái)源:億速云 閱讀:146 作者:柒染 欄目:大數(shù)據(jù)

這篇文章將為大家詳細(xì)講解有關(guān)如何進(jìn)行Vector源碼解析,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

在Java的集合類(lèi)中,除了ArrayList外,還有一些其它的集合類(lèi)它們底層也是采用數(shù)組的方式實(shí)現(xiàn)的,例如Vector集合類(lèi)。那它們?cè)谑褂蒙匣蛘哒f(shuō)在底層的實(shí)現(xiàn)方式上有何不同的呢?接下來(lái)我們將詳細(xì)來(lái)分析一下Vector集合的相關(guān)知識(shí)。

下面直接來(lái)分析Vector的底層源碼,來(lái)對(duì)比一下Vector集合與ArrayList集合在底層有何不同。我們還是和ArrayList集合一樣還是先看一下Vector集合的初始化,也就是構(gòu)造方法。

  • 初始化

如何進(jìn)行Vector源碼解析

如何進(jìn)行Vector源碼解析

如何進(jìn)行Vector源碼解析

雖然上面是3個(gè)不同的構(gòu)造方法,但是我們通過(guò)方法的調(diào)用關(guān)系就可得知,如果我們使用無(wú)參的構(gòu)造方法來(lái)創(chuàng)建Vector對(duì)象時(shí),那么上述的3個(gè)方法都會(huì)依次執(zhí)行。并且我們知道上述方法中最核心的方法也就是給數(shù)組初始化的代碼就是第3個(gè)構(gòu)造方法。因?yàn)槲覀円呀?jīng)分析過(guò)了ArrayList中的源碼,所以我們可以很容易得出以下結(jié)論:

  • Vector集合和ArrayList一樣當(dāng)集合第一次執(zhí)行默認(rèn)初始化時(shí),會(huì)將底層數(shù)組的大小設(shè)置為10

  • Vector集合與ArrayList不同的地方就是ArrayList集合當(dāng)我們使用無(wú)參構(gòu)造方法創(chuàng)建對(duì)象時(shí),并不會(huì)為數(shù)組執(zhí)行默認(rèn)初始化,第一次默認(rèn)初始化動(dòng)作發(fā)生在ArrayList集合第一次調(diào)用add()方法的時(shí)候。而在Vector集合中,當(dāng)我們使用無(wú)參構(gòu)造方法創(chuàng)建對(duì)象時(shí),則會(huì)立即執(zhí)行默認(rèn)初始化。

下面我們分析一下Vector集合的add()方法的實(shí)現(xiàn)邏輯。

  • 動(dòng)態(tài)分配

如何進(jìn)行Vector源碼解析

如何進(jìn)行Vector源碼解析

如何進(jìn)行Vector源碼解析

上述的代碼貌似我們很眼熟啊有沒(méi)有,沒(méi)錯(cuò)上述的代碼邏輯,其實(shí)和ArrayList源碼邏輯幾乎一樣。唯一的區(qū)別就是Vector集合和ArrayList集合的動(dòng)態(tài)分配方式不一樣 。在ArrayList那篇文章中,我們已經(jīng)知道了,當(dāng)?shù)讓訑?shù)組已經(jīng)達(dá)到最大容量時(shí),會(huì)自動(dòng)創(chuàng)建一個(gè)比原數(shù)組大1.5倍的數(shù)組。那么在上述代碼中我們發(fā)現(xiàn),Vector集合的底層擴(kuò)展規(guī)律是會(huì)創(chuàng)建一個(gè)是原數(shù)組2倍的數(shù)組來(lái)存儲(chǔ)元素。這也就是Vector集合與ArrayList集合的區(qū)別之一。既然是區(qū)別之一,那么就一定還有其它的區(qū)別,我們發(fā)現(xiàn)在add()方法中添加了synchronized同步關(guān)鍵字,這就說(shuō)明Vector集合是一個(gè)線程安全的集合類(lèi),這也是與ArrayList集合的區(qū)別之一,因?yàn)锳rrayList集合并不是一個(gè)線程安全的集合類(lèi)。

  • 注意事項(xiàng)

因?yàn)閂ector集合底層也是采用數(shù)組的方式實(shí)現(xiàn)的,所以它的弊端基本和ArrayList集合一樣 ,這里就不在做過(guò)多的介紹了。但有一點(diǎn)要注意,因?yàn)閂ector集合是線程安全的集合類(lèi),所以我們?cè)陂_(kāi)發(fā)多線程時(shí),可以直接使用而無(wú)需要添加額外的同步的代碼,就可保證線程的安全。但是,如果我們開(kāi)發(fā)時(shí)不是在多線程環(huán)境中運(yùn)行的,如果我們繼續(xù)使用Vector集合時(shí),就會(huì)造成我們程序的性能降低,這是因?yàn)閂ector集合底層使用了ynchronized同步關(guān)鍵字,所以每次執(zhí)行add()方法時(shí),都有頻繁的執(zhí)行獲取鎖和釋放鎖操作,這樣就會(huì)在無(wú)形之中,影響程序的性能。所以,我們?cè)谌粘5拈_(kāi)發(fā)中,如果不是在多線程環(huán)境中使用List集合的話,那么我們推薦使用ArrayList或LinkedList集合,因?yàn)樗鼈儾皇蔷€程安全的集合類(lèi),所以也就不會(huì)頻繁的執(zhí)行獲取鎖和釋放鎖操作,所以相比Vector集合,程序的運(yùn)行效率較高。

關(guān)于如何進(jìn)行Vector源碼解析就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI