概览
1 | public class Vector<E> |
Vector和ArrayList非常的相似,两者都是基于数组实现的。两者最大的不同在于Vector是线程安全的。Vector为了确保线程安全,使用了大量的synchronized方法,这也使得Vector的性能较差。
属性解释
1 | protected Object[] elementData; |
和ArrayList类似,使用了数组来作为容器,但和ArrayList不同的是,它并没有transient 修饰,也就是说在序列化时,它也会被序列化。
1 | protected int elementCount; |
elementCount记录了Vector对象中存储的有效对象的数量。在创建Vector对象的时候如果没有指明大小的话,默认的大小为10.
1 | protected int capacityIncrement; |
capacityIncrement记录了每次扩容时增加的容量大小。如果在创建Vector对象时指定了capacityIncrement的大小,那么每次扩容增加的大小就为:capacityIncrement。如果在创建的时候,没有指定capacityIncrement的大小,那么每次扩容就会扩大两倍。这和ArrayList有些许的不同。
替代方案
Vector中的方法大多都与ArrayList中的一致。但是Vector中大多方法都使用了synchronized修饰。所以可以把Vector理解为线程安全(至少官方文档说Vector是线程安全的)的ArrayList。也正因如此,所以Vector的效率非常的低。那么我们可以找到更好的替代吗?
1.使用Collections.synchronizedCollection()来获得一个线程安全的ArrayList。返回的 Collection 对象是一个装饰者对象 ,这个装饰者对象的所有方法都是同步的
1 | List<Integer> arrayList=new ArrayList<>(); |
2.使用CopyOnWriteArrayList并发容器
1 | List<Integer> arrayList=new CopyOnWriteArrayList<>(); |
它使用了读写分离的策略来实现了一个并发容器。写炒作在一个复制的数组上进行,读操作还是在原始数组中进行,读写分离,胡不影响。写操作需要加锁,防止并发写入时导致写入数据丢失。写操作结束之后需要把原始数组指向性的复制。
它适用于读多写少的应用场景。但它也是有缺陷的。它因为需要复制一个数组,索引内存占用较大。读操作可能获得过期的数据。
突然感觉这个Vector没什么好写啊! d=====( ̄▽ ̄*)b 算了,over了。