3. 常用實現類:
4. 原始碼分析(難點)
4.2 linkedlist的原始碼分析:
4.3 vector的原始碼分析:
5. 儲存的元素的要求:
1. 儲存的資料特點:儲存序的、可重複的資料。
2. 常用方法:(記住)
增:add
(object obj)
刪:remove
(int index)
/remove
(object obj)
改:set
(int index, object ele)
查:get
(int index)
插:add
(int index, object ele)
長度:size
()
遍歷:
① iterator迭代器方式
② 增強for迴圈
③ 普通的迴圈
3. 常用實現類:
|----collection介面:單列集合,用來儲存乙個乙個的物件
|----list介面:儲存序的、可重複的資料。 -->「動態」陣列,替換原的陣列
|----arraylist:作為list介面的主要實現類;執行緒不安全的,效率高;底層使用object elementdata儲存
|----linkedlist:對於頻繁的插入、刪除操作,使用此類效率比arraylist高;底層使用雙向鍊錶儲存
|----vector:作為list介面的古老實現類;執行緒安全的,效率低;底層使用object elementdata儲存
4. 原始碼分析(難點)
4.1 arraylist的原始碼分析:
1 jdk 7情況下
arraylist list = new arraylist();//底層建立了長度是10的object陣列elementdatalist.add(123);//elementdata[0] = new integer(123);
list.add(11);//如果此次的新增導致底層elementdata陣列容量不夠,則擴容。
預設情況下,擴容為原來的容量的1.5倍,同時需要將原有陣列中的資料複製到新的陣列中。
結論:建議開發中使用帶參的構造器:arraylist list = new arraylist(int capacity)
2 jdk 8中arraylist的變化:
arraylist list = new arraylist();//底層object elementdata初始化為{}.並沒建立長度為10的陣列3 小結:list.add(123);//第一次呼叫add()時,底層才建立了長度10的陣列,並將資料123新增到elementdata[0]
後續的新增和擴容操作與jdk 7 無異。
jdk7中的arraylist的物件的建立類似於單例的餓漢式,而jdk8中的arraylist的物件4.2 linkedlist的原始碼分析:的建立類似於單例的懶漢式,延遲了陣列的建立,節省記憶體。
linkedlist list = new linkedlist(); 內部宣告了node型別的first和last屬性,預設值為null
list.add(123);//將123封裝到node中,建立了node物件。
其中,node定義為:體現了linkedlist的雙向鍊錶的說法
private
static
class
node
}
4.3 vector的原始碼分析:jdk7和jdk8中通過vector()構造器建立物件時,底層都建立了長度為10的陣列。5. 儲存的元素的要求:在擴容方面,預設擴容為原來的陣列長度的2倍。
新增的物件,所在的類要重寫equals()方法面試題:arraylist、linkedlist、vector者的異同?
Collection子介面 Set介面
1.儲存的資料特點 無序的 不可重複的元素 具體的以hashset為例說明 無序性 不等於隨機性。儲存的資料在底層陣列中並非照陣列索引的順序新增,而是根據資料的雜湊值決定的。不可重複性 保證新增的元素照equals 判斷時,不能返回true.即 相同的元素只能新增乙個。2.元素新增過程 以hashs...
Collection子介面 Set介面
無序性不等於隨機性。儲存的資料在底層陣列中並非照陣列索引的順序新增,而是根據資料的雜湊值決定的。test public void test 保證新增的元素照equals 判斷時,不能返回true,即相同的元素只能新增乙個。test public void test 我們向hashset中新增元素a,...
collection的子介面set
set介面 特點 無序,不可重複!允許null元素1.hashset 內部封裝hashmap 非執行緒安全a.首先判斷hashcode 使用物件的hashcode來判斷物件加入的位置,同時也會與其他已經加入的物件的hashcode進行 比較,如果沒有相等的hashcode,hashset就會假設物件...