List (有序可重復(fù))
List列表允許存儲相同元素接奈,插入元素和按照下標(biāo)獲取元素方便煌珊,具體實(shí)現(xiàn)有ArrayList,LinkedList和Vector
- ArrayList 底層基于數(shù)組實(shí)現(xiàn),按順序存儲元素以及快速按照元素下標(biāo)進(jìn)行獲取元素固灵,不可同步的;
- 而Vector底層也是數(shù)組劫流,可進(jìn)行同步操作巫玻,在多線程環(huán)境下可以使用;
- LikedList是基于鏈表形式
1. ArrayList
ArrayList繼承AbstractList祠汇,實(shí)現(xiàn)了List<E>, RandomAccess, Cloneable, java.io.Serializable接口仍秤;
image.png
1.1構(gòu)造方法
它的構(gòu)造方法有三個:
image.png
image.png
image.png
第一個我們可以傳入一個int值,來初始化我們ArrayList的初始容量可很,如:
image.png
第二個是我們不傳入初始容量诗力,它會為我們默認(rèn)構(gòu)造一個初始容量為10的數(shù)組
第三個我們可以傳入一個列表
1.2相關(guān)方法
-
add()
image.png
在添加數(shù)據(jù)之前,先進(jìn)行了擴(kuò)容我抠,然后在數(shù)組末尾添加元素
image.png
image.png
image.png
容量的拓展將導(dǎo)致數(shù)組元素的復(fù)制苇本,多次拓展容量將執(zhí)行多次整個數(shù)組內(nèi)容的復(fù)制袜茧。若提前能大致判斷l(xiāng)ist的長度,調(diào)用ensureCapacity調(diào)整容量瓣窄,將有效的提高運(yùn)行速度笛厦。
可以理解提前分配好空間可以提高運(yùn)行速度,但是測試發(fā)現(xiàn)提高的并不是很大俺夕,而且若list原本數(shù)據(jù)量就不會很大效果將更不明顯裳凸。 - add(int index,E element )
public void add(int index, E element) {
rangeCheckForAdd(index);//檢查index是否越界
ensureCapacityInternal(size + 1); // 確保容量
System.arraycopy(elementData, index, elementData, index + 1,//將index以后的元素后移一個
size - index);
elementData[index] = element;
size++;
}
private void rangeCheckForAdd(int index) {
if (index > size || index < 0)//元素可以添加在最后尾端
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
//本地的C/C++庫方法,直接操縱內(nèi)存劝贸,速度更快
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);