ArrayList源碼理解

61、數(shù)據(jù)結(jié)構(gòu)

ArrayList底層是用數(shù)組結(jié)構(gòu)來(lái)保存數(shù)據(jù)的,所以它是一個(gè)有序結(jié)構(gòu)(和插入位置有關(guān))。它可以添加null元素。有初始容量,默認(rèn)為10,當(dāng)添加元素超過(guò)容量后,會(huì)進(jìn)行容量擴(kuò)充,新容量為oldCapacity + (oldCapacity? >> 1)也就是舊容量+舊容量的2分之1。

2、線(xiàn)程安全

ArryList是線(xiàn)程不安全的,如果需要多線(xiàn)程訪問(wèn)需要用戶(hù)自己實(shí)現(xiàn)同步(synchronized)或用其他數(shù)據(jù)結(jié)構(gòu)代替。

3、常用方法

~、get()

// 獲取index位置的元素

public E get(int index){

? ? // 下標(biāo)檢查,保證index < size

? ? rangeCheck(index);

? ? return elementData(index);

}

E elementData(index){

? ? //可以看出是數(shù)組

? ? return (E) elementData[index];

}

~、add()

//? 在數(shù)組最后添加

public boolean add(E e){

? ? // 進(jìn)行容量檢查,如果需要還要擴(kuò)容

? ? ensureCapacityInternal(size + 1);

? ? elementData[size++] = e;

? ? return true;

}

// 在指定位置添加

public void add(int index, E e){

? ? rangeCkeckForAdd(index);

? ? ensureCapacityInternal(size + 1);

? ? System.arraycopy(elementData, index, elementData, index + 1, size - index);

? ? elementData[index] = e;

? ? size++;

}

addAll(Collection<? extends E> c)

addAll(int index, Collection<? extends E> c)

2個(gè)方法同add2個(gè)方法原理一樣。

~、 remove()

// 刪除指定位置的元素

public E remove(int index){

? ? ? ? rangeCheck();

? ? ? ? modCount++;

? ? ? ? E oldValue = elementData(index);

? ? ? ? int numMoved = size - index - 1;

? ? ? ? if(numMoved > 0)

? ? ? ? ? ? System.arraycopy(elementData, index + 1, elementData, index, numMoved);

? ? ? ? // 消除引用

? ? ? ? elementData[--size] = null;

? ? ? ? return oldValue;

}

// 刪除第一次出現(xiàn)的與參數(shù)o相等的元素

public boolean remove(Object o){

? ? if(o == null){

? ? ? ? for(int index = 0; index < size; index++){

? ? ? ? ? ? if(elementData[index] == null){

? ? ? ? ? ? ? ? fastRemove(index);

? ? ? ? ? ? ? ? return true;

? ? ? ? ? ? }

? ? ? ? }

? ? }else{

? ? ? ? ? for(int index = 0; index < size; index++){

? ? ? ? ? ? ? ? if(o.equals(elementData[index])){

? ? ? ? ? ? ? ? ? ? ? fastRemove(index);

? ? ? ? ? ? ? ? ? ? ? return true;

? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? return false;

}

~、set()

// 替換index位置的的元素為element

public E set(int index, E element) {

? ? // 下標(biāo)檢查,保證index < size

? ? rangeCheck();

? ? E oldValue = elementData(index);

? ? elementData[index] = element;

? ? return oldValue;

}

~、clear()

// 清空

public void clear(){

? ? modCoumt++;

? ? for(int i = 0; i < size; i++){

? ? ? ? elementData[i] = null;

? ? }

? ? size = 0;

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容