注意:基于jdk1.8
1. ArrayList
1.1 ArrayList類結(jié)構(gòu)
在這里插入圖片描述
1.1.1 Cloneable接口
一個類要調(diào)用clone()
方法篓像,就要實現(xiàn)Cloneable
接口并且重寫Object
的clone()
方法,否則會報CloneNotSupportedException
異常皿伺,并且要在clone()
方法中調(diào)用了super.clone()
员辩,這意味著無論clone
類的繼承結(jié)構(gòu)是什么樣的,都調(diào)用了java.lang.Object
類的clone()
方法鸵鸥。
1.1.2 RandomAccess接口
實現(xiàn)了RandomAccess
接口則使用for
循環(huán)方法遍歷奠滑,沒實現(xiàn)則使用Iterator
方法遍歷,我們知道ArrayList
實現(xiàn)了RandomAccess
接口妒穴,但是LinkedList
并沒有實現(xiàn)這個接口宋税,這是因為ArrayList
的for
循環(huán)速度較快,和LinkedList
用Iterator
速度更快讼油。
1.1.3 Serializable接口
Serializable
是序列化接口杰赛,ArrayList
重寫了readObject()
和writeObject()
方法
readObject()
即反序列化,writeObject()
即序列化
1.2 ArrayList屬性
//初始容量為10
private static final int DEFAULT_CAPACITY = 10;
//指定該ArrayList容量為0時返回該空數(shù)組
private static final Object[] EMPTY_ELEMENTDATA = {};
//他與EMPTY_ELEMENTDATA區(qū)別是矮台,EMPTY_ELEMENTDATA是在ArrayList容量為0時返回淆攻,后者默認(rèn)返回
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
//保存添加到ArryList中的元素
transient Object[] elementData;
//ArrayList實際大小
private int size;
1.3 構(gòu)造方法
在這里插入圖片描述
1.4 add方法
1.4.1 add(E e)
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
上面的方法實現(xiàn)了下面兩個
- 確認(rèn)list容量,嘗試容量加1嘿架,看看有無必要
- 添加元素
在這里插入圖片描述
隨后調(diào)用
ensureExplicitCapacity(
)來確定明確的容量在這里插入圖片描述
接下來看
grow()
函數(shù)在這里插入圖片描述
總結(jié):
首先去檢查一下數(shù)組的容量是否足夠瓶珊,如果足夠就直接添加,如果不夠就
- 擴(kuò)容到原來的1.5倍
- 第一次擴(kuò)容后,如果容量還是小于
minCapacity
耸彪,就將容量擴(kuò)充為minCapacity
伞芹。
1.4.2 add(int index, E element)
public void add(int index, E element) {
rangeCheckForAdd(index);
ensureCapacityInternal(size + 1);
System.arraycopy(elementData, index, elementData, index + 1,
size - index);
elementData[index] = element;
size++;
}
在這里插入圖片描述
1.5 ArrayList總結(jié)
- ArrayList是基于
動態(tài)數(shù)組
實現(xiàn)的,在增刪時候,需要數(shù)組的拷貝復(fù)制唱较。
- ArrayList的默認(rèn)初始化容量是10扎唾,每次擴(kuò)容時候增加原先容量的一半,也就是變?yōu)樵瓉淼?.5倍
- 刪除元素時不會減少容量南缓,若希望減少容量則調(diào)用trimToSize()
- 它不是線程安全的胸遇。它能存放null值。
2. Vector
- Vector是jdk1.2的類了汉形,比較老舊的一個集合類纸镊。
- Vector底層也是數(shù)組,與ArrayList最大的區(qū)別就是:同步(線程安全)
- 如果想要ArrayList實現(xiàn)同步概疆,可以使用Collections的方法:List list =
Collections.synchronizedList(new ArrayList(...));逗威,就可以實現(xiàn)同步了 - ArrayList在底層數(shù)組不夠用時在原來的基礎(chǔ)上擴(kuò)展0.5倍,Vector是擴(kuò)展1倍岔冀。
3. LinkedList
3.1 LinkedList類結(jié)構(gòu)圖
在這里插入圖片描述
- 沒有實現(xiàn)
RandomAccess
接口凯旭,因為他用迭代器遍歷更快 - LinkedList底層是雙向鏈表
-
LinkedList
實現(xiàn)了Deque
接口,因此使套,我們可以操作LinkedList
像操作隊列和棧一樣
3.2 屬性
size罐呼,頭結(jié)點,尾結(jié)點
在這里插入圖片描述
3.3 構(gòu)造方法
在這里插入圖片描述
3.4 add
頭插和尾插
在這里插入圖片描述
在這里插入圖片描述