ArrayList 相關總結
阿新 • • 發佈:2018-11-29
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);
}
}
參考資料
支援我的話可以關注下我的微信公眾號。