天天看點

Collections之Arraylist源碼解讀(五)

Collections之Arraylist源碼解讀(五)

🍁 作者:知識淺談,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;
    }      

🍚總結