ArrayList/Vector源碼分析


摘要:本篇文章為了鞏固自身對于JDK源碼的學(xué)習(xí)里面


ArrayList



ArrayList源碼屬性字段

在ArrayList源碼中,最重要的有2個字段, elementData:用來存放數(shù)據(jù),一個size用來表示ArrayList的大小.


ArrayList.add();


首次添加元素的流程

在代碼238行有一個擴容的判斷:

擴容判斷

Java中有移位運算符

<< ? ? ?: ? ? 左移運算符,num << 1,相當于num乘以2的1次方

>> ? ? ?: ? ? 右移運算符,num >> 1,相當于num除以2的1次方


數(shù)組長度擴容

整個List的添加就已經(jīng)結(jié)束了

總結(jié):

1.ArrayList是有序的,在添加方法中可以看出來:

ArrayList.add()

2.也因為 size++? 這個操作 不是原子性的,所以在多線程環(huán)境下,會導(dǎo)致線程不安全的問題;

3.ArrayList底層利用數(shù)組的形式來進行存放數(shù)組元素;

4.最大長度為 int的最大值

最大長度



Vector類:

和ArrayList最大的區(qū)別點在于

1.它是線程安全的,其余的特性和 Arraylist是一樣的

基本所有的方法都使用了 synchronize 關(guān)鍵字


兩者區(qū)別以及選擇:


1.ArrayList是最常用的List實現(xiàn)類,內(nèi)部是通過數(shù)組實現(xiàn)的,它允許對元素進行快速隨機訪問。數(shù)組的缺點是每個元素之間不能有間隔,當數(shù)組大小不滿足時需要增加存儲能力,就要講已經(jīng)有數(shù)組的數(shù)據(jù)復(fù)制到新的存儲空間中。當從ArrayList的中間位置插入或者刪除元素時,需要對數(shù)組進行復(fù)制、移動、代價比較高。因此,它適合隨機查找和遍歷,不適合插入和刪除。

2.Vector與ArrayList一樣,也是通過數(shù)組實現(xiàn)的,不同的是它支持線程的同步,即某一時刻只有一個線程能夠?qū)慥ector,避免多線程同時寫而引起的不一致性,但實現(xiàn)同步需要很高的花費,因此,訪問它比訪問ArrayList慢。

3.LinkedList是用鏈表結(jié)構(gòu)存儲數(shù)據(jù)的,很適合數(shù)據(jù)的動態(tài)插入和刪除,隨機訪問和遍歷速度比較慢。另外,他還提供了List接口中沒有定義的方法,專門用于操作表頭和表尾元素,可以當作堆棧、隊列和雙向隊列使用。

4.vector是線程(Thread)同步(Synchronized)的,所以它也是線程安全的,而Arraylist是線程異步(ASynchronized)的,是不安全的。如果不考慮到線程的安全因素,一般用Arraylist效率比較高。

5.如果集合中的元素的數(shù)目大于目前集合數(shù)組的長度時,vector增長率為目前數(shù)組長度的100%,而arraylist增長率為目前數(shù)組長度的50%.如過在集合中使用數(shù)據(jù)量比較大的數(shù)據(jù),用vector有一定的優(yōu)勢。

6.如果查找一個指定位置的數(shù)據(jù),vector和arraylist使用的時間是相同的,都是0(1),這個時候使用vector和arraylist都可以。而如果移動一個指定位置的數(shù)據(jù)花費的時間為0(n-i)n為總長度,這個時候就應(yīng)該考慮到使用Linkedlist,因為它移動一個指定位置的數(shù)據(jù)所花費的時間為0(1),而查詢一個指定位置的數(shù)據(jù)時花費的時間為0(i)。

7.ArrayList 和Vector是采用數(shù)組方式存儲數(shù)據(jù),此數(shù)組元素數(shù)大于實際存儲的數(shù)據(jù)以便增加和插入元素,都允許直接序號索引元素,但是插入數(shù)據(jù)要設(shè)計到數(shù)組元素移動 等內(nèi)存操作,所以索引數(shù)據(jù)快插入數(shù)據(jù)慢,Vector由于使用了synchronized方法(線程安全)所以性能上比ArrayList要差,LinkedList使用雙向鏈表實現(xiàn)存儲,按序號索引數(shù)據(jù)需要進行向前或向后遍歷,但是插入數(shù)據(jù)時只需要記錄本項的前后項即可,所以插入數(shù)度較快!

籠統(tǒng)來說:LinkedList:增刪改快

ArrayList:查詢快(有索引的存在)

最后編輯于
?著作權(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)容