ArrayList和Vector都是使用數組方式存儲數據
區別大概就是Vector本身所有方法都是用synchronized修飾的,所以線程安全,而ArrayList沒有
還有一個區別就是新增元素的時候Vector的增量是原來的一倍,而ArrayList增加原來的一半
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); } }
synchronizedList修飾的list如下
private static List<String> TEST_LIST = Collections.synchronizedList(new ArrayList<String>());
包裹了普通的ArrayList提供了線程安全的機制,類似Vector,所以到此為止synchronizedList與Vector的區別就是ArrayList與Vector的增量速度區別,所以需要線程安全操作時,增量比較快的時候推薦使用Vector,其他就沒什么了
但是注意一點,
* It is imperative that the user manually synchronize on the returned * list when iterating over it: * <pre> * List list = Collections.synchronizedList(new ArrayList()); * ... * synchronized(list) { * Iterator i = list.iterator(); // Must be in synchronized block * while (i.hasNext()) * foo(i.next()); * }
synchronizedList在迭代的時候,需要開發者自己加上線程鎖控制代碼,為什么呢?
首先講下為什么要手動加線程鎖代碼:
public boolean addAll(int index, Collection<? extends E> c) { synchronized(mutex) {return list.addAll(index, c);} } public ListIterator<E> listIterator() { return list.listIterator(); // Must be manually synched by user }
因為迭代器涉及的代碼沒有在java api中沒有加上線程同步代碼
原因:整個迭代的過程中如果在循環外面不加同步代碼,在一次次迭代之間,其他線程對於這個容器的add或者remove會影響整個迭代的預期效果,所以這里需要用戶在整個循環外面加上synchronized(list)