一、概述
ArrayList是一個可以自動擴容的數組,隨機訪問的速度很快(時間複雜度爲O(1)),但是插入和移除元素的速度較慢
二、源碼分析
1. add()方法:
public boolean add(E e) {
// 容量+1
ensureCapacityInternal(size + 1); // Increments modCount!!
// 將新元素添加到數組的最後
elementData[size++] = e;
return true;
}
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
// 將老數組的元素拷貝到新數組
elementData = Arrays.copyOf(elementData, newCapacity);
}
2. remove方法
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;
}
add方法和remove方法在添加或刪除元素的時候需要擴容或縮容並且將所有的元素依次移入新的數組中,時間複雜度爲O(n),所以ArrayList在插入和刪除元素時較慢
2. get()方法
public E get(int index) {
// 判斷是否出界
rangeCheck(index);
// 返回對應位置的元素
return elementData(index);
}
三、示例
1. addAll()方法:
ArrayList<String> list_1 = new ArrayList<String>();
for (int i = 0; i < 3; i++) {
list_1.add("No." + i);
}
System.out.println("list_1: " + list_1);
ArrayList<String> list_2 = new ArrayList<String>();
for (int i = 3; i < 6; i++) {
list_2.add("No." + i);
}
System.out.println("list_2: " + list_2);
list_1.addAll(list_2);
System.out.println("list_1: " + list_1);
輸出:
list_1: [No.0, No.1, No.2]
list_2: [No.3, No.4, No.5]
list_1: [No.0, No.1, No.2, No.3, No.4, No.5]
2. 使用ListIterator遍歷
使用ListIterator遍歷:ListIterator可以向前或者向後去遍歷,並且可以從指定位置開始遍歷
ArrayList<String> list_1 = new ArrayList<String>();
for (int i = 0; i < 10; i++) {
list_1.add("No." + i);
}
ListIterator<String> iterator = list_1.listIterator(3);
while (iterator.hasPrevious()){
System.out.println("prev: " + iterator.previousIndex() + ": " + iterator.previous());
}
while (iterator.hasNext()){
System.out.println("next: " + iterator.nextIndex() + ": " + iterator.next());
}