淺談Java集合一 ArrayList和LinkedList

以下內(nèi)容純屬記錄個(gè)人對知識的理解,不對之處歡迎指出

1、ArrayList和 LinkedList 都實(shí)現(xiàn)了List接口,相同部分:

boolean add(Object o) :向集合中加入一個(gè)對象的引用

void clear():刪除集合中所有的對象,即不再持有這些對象的引用

boolean isEmpty() :判斷集合是否為空

boolean contains(Object o) : 判斷集合中是否持有特定對象的引用

Iterartor iterator() :返回一個(gè)Iterator對象,可以用來遍歷集合中的元素

boolean remove(Object o) :從集合中刪除一個(gè)對象的引用

int size() :返回集合中元素的數(shù)目

Object[] toArray() : 返回一個(gè)數(shù)組,該數(shù)組中包括集合中的所有元素

關(guān)于:Iterator() 和toArray() 方法都用于集合的所有的元素,前者返回一個(gè)Iterator對象,后者返回一個(gè)包含集合中所有元素的數(shù)組。


2、 ArrayList和?LinkedList不同部分

2.1.ArrayList采用數(shù)組結(jié)構(gòu)存儲數(shù)據(jù),按索引隨機(jī)訪問數(shù)據(jù)效率較高

2.2.LinkedList采用鏈?zhǔn)綌?shù)組結(jié)構(gòu)存儲數(shù)據(jù),添加和刪除效率較高

2.3.LinkedList多提供了addFirst、addLast、removeFirst、removeFirstOccurrence、removeLast、removeLastOccurrence等方法。


3.效率理解

數(shù)組和鏈表的區(qū)別可以參考數(shù)組與鏈表的區(qū)別 講解

3.1時(shí)間效率速度

ArrayList的內(nèi)部實(shí)現(xiàn)是基于基礎(chǔ)的對象數(shù)組的,因此,它使用get方法訪問列表中的任意一個(gè)元素時(shí)(random access),它的速度要比LinkedList快。LinkedList中的get方法是按照順序從列表的一端開始檢查,直到另外一端。對LinkedList而言,訪問列表中的某個(gè)指定元素沒有更快的方法了。

3.2空間復(fù)雜度

在LinkedList中有一個(gè)私有的內(nèi)部類,定義如下:

private static class Node {

????E item;

????Node?next;

????Node?prev;

????Node(Node prev,Eelement,Node next) {

????this.item= element;

????this.next= next;

????this.prev= prev;

????}

}

每個(gè)Node對象reference列表中的一個(gè)元素,同時(shí)還有在LinkedList中它的上一個(gè)元素和下一個(gè)元素。一個(gè)有多個(gè)元素的LinkedList對象將有多個(gè)鏈接在一起的Node對象,每個(gè)對象都對應(yīng)于列表中的一個(gè)元素。這樣的話,在一個(gè)LinkedList結(jié)構(gòu)中將有一個(gè)很大的空間開銷,因?yàn)樗鎯@多個(gè)Node對象的相關(guān)信息。

ArrayList使用一個(gè)內(nèi)置的數(shù)組來存儲元素,所以在插入數(shù)據(jù)的時(shí)候,數(shù)組長度不夠時(shí),會增加數(shù)組長度,數(shù)組增加的長度采用以下方式增加

private void grow(intminCapacity) {

// overflow-conscious code

int oldCapacity =elementData.length;

int newCapacity = oldCapacity + (oldCapacity >>1);

if(newCapacity - minCapacity <0)

newCapacity = minCapacity;

if(newCapacity -MAX_ARRAY_SIZE>0)

newCapacity =hugeCapacity(minCapacity);

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

elementData= Arrays.copyOf(elementData,newCapacity);

}

所以沒有足夠的空間來存放新的元素,數(shù)組將不得不被重新進(jìn)行分配以便能夠增加新的元素。會存在一種數(shù)組長度>數(shù)據(jù)長度造成空間浪費(fèi)同時(shí)也需要復(fù)制完所有的數(shù)組內(nèi)容。


純屬個(gè)人理解,希望不會誤導(dǎo)讀者。

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

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

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