🍁 作者:知識淺談,CSDN部落格專家,阿裡雲簽約部落客,InfoQ簽約部落客,華為雲雲享專家
📌 擅長領域:全棧工程師、爬蟲、ACM算法
💒 公衆号:知識淺談
Collections之Arraylist源碼解讀(五)總結
正菜來了⛳⛳⛳
🎈ArrayList中相關方法函數解讀
🍮lastIndexOf(Object o)
這個函數的含義是從底層數組後邊向前查找,找到第一個對象等于o的位置并傳回,如果沒有就傳回-1,更正式地說,傳回滿足 (o==null ? get(i)==null : o.equals(get(i))) 的最高索引 i,如果沒有這樣的索引,則傳回 -1。
public int lastIndexOf(Object o) {
if (o == null) {
for (int i = size-1; i >= 0; i--)
if (elementData[i]==null)
return i;
} else {
for (int i = size-1; i >= 0; i--)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
🍮clone()
這個函數的作用是新建立一個ArrayList數組,并把目前的Arraylist中的底層的數組進行拷貝一份,把新ArrayList的elementData指向新的建立的數組。
public Object clone() {
try {
ArrayList<?> v = (ArrayList<?>) super.clone();
v.elementData = Arrays.copyOf(elementData, size);
v.modCount = 0;
return v;
} catch (CloneNotSupportedException e) {
// this shouldn't happen, since we are Cloneable
throw new InternalError(e);
}
}
方法中調用的Arrays.copyOf是一種深拷貝的方法。
🍮get(int index)
這個最常見的方法,見名知意,傳回對應索引位置的的元素,但是傳回之前先檢查索引是都超出了範圍。
public E get(int index) {
rangeCheck(index);
return elementData(index);
}
上邊方法中調用了rangeCheck(index)這個函數主要是判斷index大于等于size,會抛出IndexOutOfBoundsException索引溢出異常。
🍮E set(int index, E element)
同樣這個也是見文知意,先進行檢查,判斷索引是否超出了elementData的容器的範圍,如果沒有超出,再在指定的位置上設定相應的元素,并把舊元素傳回。
public E set(int index, E element) {
rangeCheck(index);
E oldValue = elementData(index);
elementData[index] = element;
return oldValue;
}
🍮add(E e)
這個函數的作用是在ArrayList清單中添加一個元素,但是添加元素之前需要做一些檢查,如數組長度的大小能夠添加元素的大小。
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
🍮remove(int index)
public E remove(int index) {
rangeCheck(index);
modCount++;
E oldValue = elementData(index);
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // clear to let GC do its work
return oldValue;
}