-
- public void add(int index, E element) {
- if (index > size || index < 0)
- throw new IndexOutOfBoundsException(
- "Index: "+index+", Size: "+size);
- ensureCapacity(size+1); // Increments modCount!!
- System.arraycopy(elementData, index, elementData, index + 1,
- size - index);
- elementData[index] = element;
- size++;
- }
- 看源碼就知道了,無論傳入的是哪個index,都要進過if判斷,
- 假如不超過容量,看這個System.arraycopy,這其實是個native方法,方法我們發現實現的是自我複製,首先用臨時數組把index後的數據取走然後再拷回到index+1ao後面,此時我們分析下,如果加在最前,那所有數據都需要用中間臨時數組拷貝走,再拷貝回來,如果加在最後,length=0,就不需要用到臨時數組了,直接加進來即可繼續看System.arraycopy源碼,這是一個本地方法,代碼見http://www.360doc.com/content/14/0713/19/1073512_394157835.shtml,
-
- 可以看到length=0時,直接返回,
- 當大於0時最後用到了c語言的void *memmove(void *dst, const void *src, size_t count)函數。
- 所以說加到後半部分是優於加到前半部分的。
-
- 同時這也說明了arraylist的add()無index方法加到最後的原因,此時無需中間數組,也少了一次本地方法調用。
-
這是add()無index參數的源碼
-
public boolean add(E e) {
ensureCapacityInternal(size + 1);
elementData[size++] = e;
return true;
}
- remove也是這樣,後半部分比前半部分效率高