集合初探 認識List

2021-08-25 18:42:00 字數 3370 閱讀 3500

[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...