List和Set總結
阿新 • • 發佈:2021-02-07
首先List介面與Set介面都是繼承自Collection介面,
List
list介面的特點是存放的元素 有序且可重複
主要常用實現類有ArrayList,linkedList,vector
ArrayList:
- 儲存結構:一個Object陣列,採用預設初始化則預設開闢一個空陣列(空陣列new Object { } 不是null陣列)
- 優缺點:遍歷查詢速度快,支援隨機高效訪問,但是刪除插入速度較慢。
- 擴容方式:擴容方法grow(); 情況1:當還是空陣列的時候新增第一個元素時會直接擴容長度到10。情況2:當元素已滿時,再向其新增新的元素時,陣列會擴容1.5倍。(擴容後的陣列是擴容前的1.5倍)但是最大容量是 Integer.MAX_VALUE - 8和 Integer.MAX_VALUE (即integer的最大值) 下附原始碼:
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
//如果需要的最小長度大於了Integer.MAX_VALUE - 8哪麼陣列長度即等於 Integer.MAX_VALUE否則等於Integer.MAX_VALUE - 8
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}
linkedList
- 儲存結構: 雙向連結串列儲存,(1.6之前是雙向迴圈連結串列,1.7取消了迴圈)
- 優缺點: 插入刪除速度很快,但是遍歷速度較慢,不支援隨機高效的訪問。
- 相對於ArrayList而言,LinkedList消耗的空間要比前者多一點,因為Linked list每個元素都會儲存 per(指向前一個元素的指標) item(元素值) next(指向下一個元素)
vector
- 儲存結構:vector採用object陣列儲存資料,採用預設初始化時會直接指定一個長度為10的陣列,這也是和ArrayList的一個區別。
- 優缺點: vector因為加上了synchronizaed同步鎖,所以執行緒安全。但是效能會降低一些。
- 擴容方式:擴容方法grow(); vector正常情況下會擴容到原陣列的二倍,但是如果我們在初始化的時候自己傳入增量,則會按照自己傳入的增量來進行擴容;
原始碼如下:
public Vector(int initialCapacity, int capacityIncrement) {
//初始化陣列長度 //增量
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];
//用傳入的增量代替預設的增量
this.capacityIncrement = capacityIncrement;
}
/*******************選取自擴容程式碼grow()*************************/
int newCapacity = oldCapacity + ((capacityIncrement > 0) ?capacityIncrement : oldCapacity);
//新的長度的指定方式。
Set
Set介面的特點是:無序且唯一;
主要的實現類: hashset , linkedhashset, treeset
Hashset : 還是使用hashmap(陣列+連結串列+紅黑樹)實現儲存;其實整個set就是一個"偽裝"的map 哈哈哈
private transient HashMap<E,Object> map;//set介面中宣告的成員變數
private static final Object PRESENT = new Object();//填充value的object型別元素
- *儲存結構: set的元素都儲存再hashmap的key上,所以key不重複且無序。而hashmap的value處使用一個object型別的靜態常量來進行填充。
- hashset可以儲存null值,執行緒不安全;
- hashset如何識別重複元素: 首先當一個物件加入set中時,會計算物件的hashcode值來判斷物件加入的位置,如果此位置為空,則加入;如果不為空,就依次比較當前位置所在的連結串列,如果連結串列中沒有相同的hashcode,代表不重複,如果有相同的hashcode,就呼叫equals方法檢查內容是否一樣,內容不一樣則新增。
Linkedhashset
- 儲存結構:(採用linkedhashmap實現)繼承自hashset,且linkedhashset在結構上又加上了連結串列來記錄元素加入的順序,所以集合變成有序的,
- linkedhashset可以儲存null元素。
treeset
- 儲存結構:採用treemap(紅黑樹)儲存。是一類有序且可排序的集合,不可儲存null元素,否則丟擲空指標異常;
- 排序方式兩種:
-
*第一種:自然排序,集合元素自己實現comparable介面,重寫compareTo方法
-
*第二種:自定義排序,建立set時傳入一個自定義的比較器comparator介面,重寫compare方法,實現自定義排序
- 優點:查詢效率很高;
關於Set的擴容機制就放到Map的總結當中擴充套件,因為Set其本身實現就是一個Map