線程安全
ArrayList內部沒有實現原子性操作,所以是非線程安全的。如果需要在線程安全的環境下使用List的話,需要使用Vector 或者CopyOnWriteArrayList,具體場景,自行深入了解。
擴容算法
// minCapacity 為需要的最小容量
private void grow(int minCapacity) {// overflow-conscious codeint 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);
}private static int hugeCapacity(int minCapacity) {if (minCapacity < 0) // overflowthrow new OutOfMemoryError();return (minCapacity > MAX_ARRAY_SIZE) ?Integer.MAX_VALUE :MAX_ARRAY_SIZE;
}
- 如代碼所示,先在原來容量的基礎上進行 1.5 倍的擴容;
- 如果擴容之后的值小于最小的容量需求,則使用最小容量需求;
- 如果擴容之后超出數組的限制長度,則根據最小容量需求判斷使用Integer最大值還是數組限制長度。
indexOf 或者 lastIndexOf 的使用
這兩個方法內部都是遍歷實現的,所以在數組很大的時候盡量不要使用這兩個方法,以免影響效率。
時間復雜度相關
- get 方法為 O(1);
- add(E e) 方法在尾部添加,為 O(1),add(int index, E element)方法在中間添加,時間復雜度最壞情況為O(n);
- remove 方法時間復雜度最壞情況為O(n)。
GC 相關的借鑒
remove 和 clear 操作之后都會做一次釋放資源的操作,目的是釋放資源,以便GC回收。