1. 程式人生 > >9.3-全棧Java筆記:List接口常用實現類的特點和底層實現

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

java

上節我們講到「List接口的特點和常用方法」,本節接著上節的內容繼續深入學習。


課前回顧:

List接口常用的實現類有3個:ArrayListLinkedListVector

那麽它們的特點和底層實現有哪些呢?

ArrayList特點和底層實現


ArrayList底層是用數組實現的存儲。

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

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


ArrayList是可以存放任意數量的對象,數組長度是有限的,那麽是怎麽實現的呢?

本質上就是通過定義新的更大的數組,將舊數組內容拷貝到新數組,來實現擴容。

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

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特點和底層實現

LinkedList底層用雙向鏈表實現的存儲。

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

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

每個節點都應該有3部分內容:

class Node {

Node previous; //前一個節點

Object element; //本節點保存的數據

Node next; //後一個節點

}

我們查看LinkedList的源碼,可以看到裏面包含了雙向鏈表的相關代碼:

註:entry在英文中表示“進入、詞條、條目”的意思。在計算機英語中一般表示“項、條目”的含義。

Vector向量

Vector底層用數組實現的List,相關的方法都加了同步檢查,因此“線程安全,效率低”。 比如,indexOf方法就增加了synchronized同步標記。

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

老鳥建議

如何選用ArrayListLinkedListVector?

·線程安全時,用Vector

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

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




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


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

A-Java入門階段

B-數據庫從入門到精通

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

D-J2EE從了解到實戰

E-Java高級框架精解

F-Linux和Hadoop




本文出自 “12931675” 博客,請務必保留此出處http://12941675.blog.51cto.com/12931675/1943917

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