9.3-全棧Java筆記:List接口常用實現(xiàn)類的特點和底層實現(xiàn)

上節(jié)我們講到「List接口的特點和常用方法」,本節(jié)接著上節(jié)的內(nèi)容繼續(xù)深入學(xué)習(xí)。


課前回顧:?

List接口常用的實現(xiàn)類有3個:ArrayList、LinkedList、Vector。

那么它們的特點和底層實現(xiàn)有哪些呢?

ArrayList特點和底層實現(xiàn)


ArrayList底層是用數(shù)組實現(xiàn)的存儲。

特點:查詢效率高,增刪效率低,線程不安全。我們一般使用它。

查看源碼,我們可以看出ArrayList底層使用Object數(shù)組來存儲元素數(shù)據(jù)。所有的方法,都圍繞這個核心的Object數(shù)組來開展。


ArrayList是可以存放任意數(shù)量的對象,數(shù)組長度是有限的,那么是怎么實現(xiàn)的呢?

本質(zhì)上就是通過定義新的更大的數(shù)組,將舊數(shù)組內(nèi)容拷貝到新數(shù)組,來實現(xiàn)擴(kuò)容。

ArrayList的Object數(shù)組初始化長度為10,如果我們存儲滿了這個數(shù)組,需要存儲第11個對象,就會定義新的數(shù)組長度長度更大的數(shù)組,并將將原數(shù)組內(nèi)容和新的元素一起加入到新數(shù)組中,源碼中代碼如下:

?public?void?? ensureCapacity(int?? minCapacity) {

??? modCount++;

????int?? oldCapacity = elementData.length;

????if?? (minCapacity > oldCapacity) {

??? ??? Object oldData[] = ? elementData;

??? ????int?? newCapacity = (oldCapacity * 3)/2 + 1;

??? ?????if?? (newCapacity < minCapacity)

?????? newCapacity = minCapacity;

????????????// ? minCapacity is usually close to size, so this is a win:

??????????? elementData = ? Arrays.copyOf(elementData, newCapacity);

??? }

}

LinkedList特點和底層實現(xiàn)

LinkedList底層用雙向鏈表實現(xiàn)的存儲。

特點:查詢效率低,增刪效率高,線程不安全。

雙向鏈表也叫雙鏈表,是鏈表的一種,它的每個數(shù)據(jù)節(jié)點中都有兩個指針,分別指向前一個節(jié)點和后一個節(jié)點。?所以,從雙向鏈表中的任意一個節(jié)點開始,都可以很方便地找到所有節(jié)點。

每個節(jié)點都應(yīng)該有3部分內(nèi)容:

????class? Node {

?????? Node??previous;???//前一個節(jié)點

?????? Object??element;????//本節(jié)點保存的數(shù)據(jù)

?????? Node??next;???????//后一個節(jié)點

}

我們查看LinkedList的源碼,可以看到里面包含了雙向鏈表的相關(guān)代碼:

注:entry在英文中表示“進(jìn)入、詞條、條目”的意思。在計算機(jī)英語中一般表示“項、條目”的含義。

Vector向量

Vector底層用數(shù)組實現(xiàn)的List,相關(guān)的方法都加了同步檢查,因此“線程安全,效率低”。?比如,indexOf方法就增加了synchronized同步標(biāo)記。

【圖】Vector的源碼(indexOf方法)

老鳥建議

如何選用ArrayList、LinkedList、Vector?

·線程安全時,用Vector。

·?局部變量不存在線程安全問題時,并且查找較多用ArrayList(一般使用它)

·局部變量不存在線程安全問題時,增加或刪除元素較多用LinkedList。





「全棧Java筆記」是一部能幫大家從零到一成長為全棧Java工程師系列筆記。筆者江湖人稱 Mr. G,10年Java研發(fā)經(jīng)驗,曾在神州數(shù)碼、航天院某所研發(fā)中心從事軟件設(shè)計及研發(fā)工作,從小白逐漸做到工程師、高級工程師、架構(gòu)師。精通Java平臺軟件開發(fā),精通JAVAEE,熟悉各種流行開發(fā)框架。


筆記包含從淺入深的六大部分:

A-Java入門階段

B-數(shù)據(jù)庫從入門到精通

C-手刃移動前端和Web前端

D-J2EE從了解到實戰(zhàn)

E-Java高級框架精解

F-Linux和Hadoop?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容