[size=large][color=blue][b]1. arraylist[/b][/color][/size]
a) 底層資料結構
[img]
·本質是乙個object陣列,存放的是物件引用序列。size代表元素個數。
·採用陣列並通過演算法保證了集合元素有序,允許重複的特性。
b) 構造方法
public arraylist()
·建立乙個arraylist,預設大小為10。
c) 插入物件
·插入元素面臨的乙個重要的問題就是空間不夠(這也是陣列的最大弊端),如何擴容?arraylist是通過乙個公開的方法ensurecapacity(int mincapacity)來實現。
public void ensurecapacity(int mincapacity)
}
·先計算新的陣列大小
·原陣列的容量*1.5+1
·擴容後會檢查是否能滿足需要,若陣列大小還不夠,會直接擴容到需要的大小。這種情況主要發生在批量增加集合中的元素。
·再擴容(按照新的大小生成陣列),同時拷貝原arraylist中的元素。
·底層呼叫的是native方法:system.arraycopy(original, 0, copy, 0, math.min(original.length, newlength));
·頻繁的擴容(移動元素)是耗效能的。若能明確list大小,給arraylist設定合理的初始值是比較理想的。
·然後將新增元素插入到指定位置。
·批量增加集合中的元素會涉及兩次拷貝。擴容會拷貝原陣列元素,還會拷貝需要增加的集合中的元素。
public boolean addall(collection<? extends e> c)
d)刪除物件
private void fastremove(int index)
·先通過for迴圈遍歷(三種遍歷方式:for迴圈,foreach,迭代iterator)找到刪除元素。
·然後移動元素(被刪除元素後的所有元素),再將最後乙個元素設定為null,交給gc完成物件的**。
·對於負數是不檢查的,而是直接訪問,直到丟擲arrayindexoutofbound***ception,參考 rangecheck(int index)。
·刪除元素,但是陣列空間不會釋放,可以呼叫trimtosize()縮小陣列容量(arraylist不會自動呼叫)
public void trimtosize()
}
e)查詢物件
·獲取物件的位置:indexof(object o),從第乙個元素往後查詢;lastindexof(object o),從最後乙個元素往前查詢。
·判斷物件是否存在:contains(object o),本質呼叫的是indexof(object o)。
·採用for迴圈遍歷查詢的方式。
[size=large][color=blue][b]2.linkedlist[/b][/color][/size]
a)底層資料結構
[img]
[img]
·底層採用雙向迴圈鍊錶結構實現。
·header:雙向鍊錶的頭;entry:包含三部分--物件資料,指向後乙個entry的引用,指向前乙個entry的引用。
b)構造方法
public linkedlist()
private transient entryheader = new entry(null, null, null);
entry(e element, entrynext, entryprevious)
·構造entry(null,null,null):屬性值全為null,同時賦值給header。
·構造方法僅僅生成雙向鍊錶結構:header.next = header.previous = header。
c)插入物件
private entryaddbefore(e e, entryentry)
·不用考慮擴容和資料複製(移動)。
·在header前插入,無須遍歷。
·建立乙個新物件,修改相鄰元素屬性。
d)刪除物件
·遍歷與匹配和arraylist相似。
·刪除元素:修改相鄰元素屬性,被刪除元素屬性置為null。無需複製元素。
e)查詢物件
·與arraylist相似,不同的是linkedlist不支援下標index,在遍歷的時候,臨時記錄乙個index。
·獲取物件的位置:indexof(object o),從第乙個元素往後查詢;lastindexof(object o),從最後乙個元素往前查詢。
·判斷物件是否存在:contains(object o),本質呼叫的是indexof(object o)。
·採用for迴圈遍歷查詢的方式。
[size=large][color=blue][b]3.vector[/b][/color][/size]
·繼承abstractlist,實現list介面。與arraylist相似。
·執行緒安全。
·初始大小為10。
·擴容策略與arraylist不一樣:
private void ensurecapacityhelper(int mincapacity)
elementdata = arrays.copyof(elementdata, newcapacity);}}
·通過capacityincrement控制:如果capacityincrement>0,每次增加capacityincrement。否則擴大為原來的兩倍。
[size=large][color=blue][b]4.stack[/b][/color][/size]
·後進先出:lifo;入棧:push(e);出棧:pop(),返回最後乙個元素並刪除元素;peek(),返回最後乙個元素但不刪除。
·繼承vector,執行緒安全的,這使得stack也變得重量級。
·stack的父類不應該為vector的,因為vector的底層是陣列(增刪效率比較低),且vector有get方法(意味著它可能訪問到並不屬於最後乙個位置元素的其他元素,很不安全)。
·不考慮併發,怎麼實現stack的功能?封裝linkedlist也許是不錯的選擇。
Collection集合,List集合
一 collection集合 a collection 集合 單身漢集合 list 特點 有序,可重複,有索引 arraylist 重點掌握 linkedlist 儲存的元素不可重複,訪問順序一致 set 無序,元素不可重複,元素無索引 hashset 重點掌握 linkedhashset tree...
List集合 Set集合
一 請簡述list介面的特點。v 它是乙個元素訪問有序的集合。例如,存元素的順序是11 22 33。那麼集合中,元素的儲存就是按照11 22 33的順序完成的 v 它是乙個帶有索引的集合,通過索引就可以精確的操作集合中的元素 與陣列的索引是乙個道理 v 集合中可以有重複的元素,通過元素的equals...
關於list集合
list雖然是啥都能放的集合,在不加泛型限制的情況下,是什麼都能放進去,放進去了,也能直接get拿出來。但是如果用了foreach迴圈,或者是迭代器,foreach迴圈和迭代器是有條件的迭代出集合裡面的值!就好比下面的例子 首先宣告alist是乙個list集合 public void foreach...