本文主要是分析實現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 ...