Java學習筆記 容器之List

2021-08-11 09:03:45 字數 2284 閱讀 3496

本文主要是分析實現list介面的arraylist、linkedlist、vector、stack的原始碼。

1. arraylist

arraylist是使用object陣列儲存資料的,並且加上了transient關鍵字,所以在arraylist序列化時,elementdata不會直接被序列化

transient object elementdata;
arraylist有3種建構函式:第1種是無參的,這時候

elementdata是乙個長度為0的空陣列, 當往list裡新增元素時才會為elementdata分配空間;第2種是傳入

initialcapacity

的引數,會為

elementdata分配

initialcapacity的空間;第3種是傳入list,此時會用

arrays.copyof拷貝傳入list中的資料給elementdata。

arraylist中陣列採用1.5倍的增長方式的,如果增長後空間還不夠,則陣列長度取當前要插入資料總長度,增長後將原來的資料拷貝到新生成的陣列中,**如下:

private void grow(int mincapacity)

2.linkedlist

linkedlist是採用鍊錶儲存資料的list,有

以下三個成員變數,分別表示長度、煉表頭、鍊錶尾。

transient int size = 0;

transient nodefirst;

transient nodelast;

其中,node的定義如下:

private static class node

}

linkedlist除了支援list介面的方法外,還支援peek、poll、push、pop等方法,只要對於資料結構有一定了解的同學都能夠完成類似**的編寫,因此在此就不做過多的介紹。 另外,在linkedlist的remove和clear方法中,都有將node的item、next、prev置為null,以便gc**。

public void clear() 

first = last = null;

size = 0;

modcount++;

}

3.vector

vector同arraylist一樣,都是採用陣列來儲存資料,但vector與arraylist有兩點不同:

(1)vector在public的方法上使用了 synchronized 關鍵字來保證同步

(2)vector在構造時可以傳遞乙個長度的增長量

capacityincrement

,如果該值不小於0則每次按該值增長,否則按2倍增長。

4.stack

stack繼承自vector,只不過多了peek、push、pop三個方法。

上述的arraylist、linkedlist、vector、stack,arraylist和linkedlist都是非執行緒安全的,因此要使用執行緒安全的list,可以呼叫collections.synchronizedlist方法,它會將傳入的list包裝成synchronizedlist,是執行緒安全的,**如下:

public static listsynchronizedlist(listlist)
synchronizedlist繼承自synchronizedcollection,它有乙個成員變數mutex作為同步的訊號量,在實現的list的每乙個方法中,採用synchronized關鍵字獲取mutex,然後再呼叫包裝前的list相應方法。

5.copyonwritearraylist

copyonwritearraylist也是採用陣列來儲存資料的,

但是它每次新增資料時都會重新生成乙個新的陣列,因此copyonwritearraylist適用於讀多寫少的場景。

與上述幾個類不同,它位於concurrent包,通過reentrantlock型別的成員變數lock實現執行緒安全,在add、remove、retain、set等方法對資料進行操作之前,先呼叫

reentrantlock的lock()方法獲取鎖,操作完成之後再調unlock釋放鎖。如add方法的原始碼如下所示:

public boolean add(e e)  finally 

}

C 學習筆記 List容器

1.雙向鍊錶容器 2.不能隨機存放元素,不支援at.pos 函式與 操作符,可以it 但不能it n include using namespace std include void main cout l.size endl list iterator it l.begin while it l....

STL學習筆記 序列式容器list

由於vector的使用,經常會出現迭代器錯誤,主要是因為vector在每次更改完資料就會重新配置,迭代器就會失效,list的結構和vector的設計差異決定了list在這方面具有優越性,list的insert和splice操作不會造成迭代器失效,並且erase也只會是讓當前元素的迭代器失效。list...

STL學習筆記 list容器 雙鏈表

簡介 list是雙向鍊錶容器,可以高效地進行插入和刪除元素 list不可以隨機訪問元素,所以不支援at pos 和 操作 list的迭代器可以 it 但是不能例如 it 5 標頭檔案 include list基本操作 front back push back pop back push front ...