- 1.ArrayList是實現了基於動態數組的數據結構,LinkedList基於鏈表的數據結構。
- 2.對於隨機訪問get和set,ArrayList覺得優於LinkedList,因為LinkedList要移動指針。
- 3.對於在指定index位置新增和刪除操作add和remove,LinedList比較占優勢,因為ArrayList要移動數據。
- 4.ArrayList中的操作不是線程安全的!所以,建議在單線程中才使用ArrayList,而在多線程中可以選擇Vector或者CopyOnWriteArrayList。LinkedList線程安全的處理方法
方法一:List<String> list = Collections.synchronizedList(new LinkedList<String>());
方法二:將LinkedList全部換成ConcurrentLinkedQueue
- 為什么在創建ArrayList對象時要初始化默認容量?
其實就是為了避免擴容,ArrayList擴容方法,這里 ensureCapacityInternal 才是ArrayList內部調用的擴容方法
/**
* 公有方法
*/
public void ensureCapacity(int minCapacity) {
int minExpand = (elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
// any size if not default element table
? 0
// larger than default for default empty table. It's already
// supposed to be at default size.
: DEFAULT_CAPACITY;
if (minCapacity > minExpand) {
ensureExplicitCapacity(minCapacity);
}
}
private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
擴容的大小為原容量的1.5倍+1(其實是>>1),該方法下有會改變
modCount的值
modCount變量用於在遍歷集合(iterator())時,檢測是否發生了add、remove操作。
boolean add(E e) ;//在尾部加入元素
void add(int index, E element) ;//在指定位置加入元素
因為調用arraycopy,所以效率低。(但是也沒低到哪去 執行100次 每次插入1百萬條,查了0.016s)
System.arraycopy(elementData, index, elementData, index + 1,size - index);