1. 程式人生 > >ArrayList 相關總結

ArrayList 相關總結

ArrayList是 List 介面的可變陣列實現,底層使用陣列儲存所有元素。其操作基本上是對陣列的操作。

ArrayList 概述

ArrayList 相當於動態陣列,每個 ArrayList 例項都有一個容量,該容量是指用於儲存列表元素的陣列的大小,它總是至少等於列表的大小。隨著向ArrayList中不斷新增元素,其容量自動增長。

自動增長會帶來資料向新陣列的重新拷貝

ArrayList 的常見方法

1. set() 方法
// 用指定的元素替代此列表中指定位置上的元素,並返回以前位於該位置上的元素。  
public E set(int index, E element) {  
    RangeCheck(index
); E oldValue = (E) elementData[index]; elementData[index] = element; return oldValue; }
2. add() 方法
// 將指定的元素新增到此列表的尾部。  
public boolean add(E e) {  
    ensureCapacity(size + 1);   
    elementData[size++] = e;  
    return true;  
}  
// 將指定的元素插入此列表中的指定位置。  
// 如果當前位置有元素,則向右移動當前位於該位置的元素以及所有後續元素(將其索引加1)。  
public void add(int index, E element) { if (index > size || index < 0) throw new IndexOutOfBoundsException("Index: "+index+", Size: "+size); // 如果陣列長度不足,將進行擴容。 ensureCapacity(size+1); // Increments modCount!! // 將 elementData中從Index位置開始、長度為size-index的元素, // 拷貝到從下標為index+1位置開始的新的elementData陣列中。
// 即將當前位於該位置的元素以及所有後續元素右移一個位置。 System.arraycopy(elementData, index, elementData, index + 1, size - index); elementData[index] = element; size++; }
// 按照指定collection的迭代器所返回的元素順序,將該collection中的所有元素新增到此列表的尾部。  
public boolean addAll(Collection<? extends E> c) {  
    Object[] a = c.toArray();  
    int numNew = a.length;  
    ensureCapacity(size + numNew);  // Increments modCount  
    System.arraycopy(a, 0, elementData, size, numNew);  
    size += numNew;  
    return numNew != 0;  
}  
// 從指定的位置開始,將指定collection中的所有元素插入到此列表中。  
public boolean addAll(int index, Collection<? extends E> c) {  
    if (index > size || index < 0)  
        throw new IndexOutOfBoundsException(  
            "Index: " + index + ", Size: " + size);  

    Object[] a = c.toArray();  
    int numNew = a.length;  
    ensureCapacity(size + numNew);  // Increments modCount  

    int numMoved = size - index;  
    if (numMoved > 0)  
        System.arraycopy(elementData, index, elementData, index + numNew, numMoved);  

    System.arraycopy(a, 0, elementData, index, numNew);  
    size += numNew;  
    return numNew != 0;  
}  
3. get() 方法
// 返回此列表中指定位置上的元素。  
public E get(int index) {  
    RangeCheck(index);  

    return (E) elementData[index];  
}  
4. remove() 方法
// 移除此列表中指定位置上的元素。  
public E remove(int index) {  
    RangeCheck(index);  

    modCount++;  
    E oldValue = (E) elementData[index];  

    int numMoved = size - index - 1;  
    if (numMoved > 0)  
        System.arraycopy(elementData, index+1, elementData, index, numMoved);  
    elementData[--size] = null; // Let gc do its work  

    return oldValue;  
}  
// 移除此列表中首次出現的指定元素(如果存在)。這是應為ArrayList中允許存放重複的元素。  
public boolean remove(Object o) {  
    // 由於ArrayList中允許存放null,因此下面通過兩種情況來分別處理。  
    if (o == null) {  
        for (int index = 0; index < size; index++)  
            if (elementData[index] == null) {  
                // 類似remove(int index),移除列表中指定位置上的元素。  
                fastRemove(index);  
                return true;  
            }  
} else {  
    for (int index = 0; index < size; index++)  
        if (o.equals(elementData[index])) {  
            fastRemove(index);  
            return true;  
        }  
    }  
    return false;  
}  

注意:從陣列中移除元素的操作,也會導致被移除的元素以後的所有元素的向左移動一個位置。

調整容量
public void ensureCapacity(int minCapacity) {  
    modCount++;  
    int oldCapacity = elementData.length;  
    if (minCapacity > oldCapacity) {  
        Object oldData[] = elementData;  
        int newCapacity = (oldCapacity * 3)/2 + 1;  
            if (newCapacity < minCapacity)  
                newCapacity = minCapacity;  
      // minCapacity is usually close to size, so this is a win:  
      elementData = Arrays.copyOf(elementData, newCapacity);  
    }  
}  
參考資料

支援我的話可以關注下我的微信公眾號。