Vector和ArrayList操作基本相同,只不过对方法加了synchronized做同步处理,以add方法为例
//扩容重点步骤:确定扩容的大小
private int newCapacity(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
capacityIncrement : oldCapacity);
if (newCapacity - minCapacity <= 0) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return minCapacity;
}
return (newCapacity - MAX_ARRAY_SIZE <= 0)
? newCapacity
: hugeCapacity(minCapacity);
}
每次扩容扩为原来二倍,和ArrayList不同。
ArrayList和LinkedList都是线程不安全的,因此若想要实现线程安全有一下替换的实现方案
-
方案一:用Collections.synchronizedList()方法构造出一个线程安全的list(ArrayList和LinkedList都可以使用)
List synList1 = Collections.synchronizedList(new ArrayList<>());
List synList2 = Collections.synchronizedList(new LinkedList<>()); -
方案二:用java…concurrent包下面的CopyOnWriteArrayList替代ArrayList
CopyOnWriteArrayList:重点是读写分离
原理:
写操作的时候会在一个复制的数组上进行,并且要加锁
读操作在原数组上进行
写操作完毕之后,读操作的数组指针指向新的复制数组 -
方案三:vector