2018-08-08

Java集合类的底层实现

Vector底层实现和原理

Vector作为List的另外一个典型实现类,完全支持List的全部功能,Vector类也封装了一个动态的,允许在分配的Object[]数组,Vector是一个比较古老的集合,JDK1.0就已经存在,建议尽量不要使用这个集合,Vector与ArrayList的主要是区别是,Vector是线程安全的,但是性能比ArrayList要低。

成员变量

protected Object[] elementData; //存放元素的数组 

protected int elementCount; //已经放入数组的元素个数 

protected int capacityIncrement; //数组的增长系数

构造函数

1.提供初始大小,和增长系数

public Vector(intinitialCapacity,intcapacityIncrement);

2.提供初始大小,增长系数为零

public Vector(int initialCapacity);

3.无参构造方法

默认值为10

4.将指定的集合元素转化为Vector

public Vector(Collection c);

总结:

Vector和ArrayList的实现方式可以看出非常的类似,既然Vector类建议尽量少的使用,还是最好不要用了,通过上面的源码发现,每个方法中都添加了synchronized的关键字来保证同步,所以它是线程安全的,但正是这些方法的同步,让它的效率大大的降低了,比ArrayList的效率要慢。

1.Vector有四个不同的构造方法。无参构造方法的容量为默认值10,仅包含容量的构造方法则将容量增长量(从源码中可以看出容量增长量的作用,第二点也会对容量增长量详细说)明置为0。

2.注意扩充容量的方法ensureCapacityHelper。

与ArrayList相同,Vector在每次增加元素(可能是1个,也可能是一组)时,都要调用该方法来确保足够的容量。当容量不足以容纳当前的元素个数时,就先看构造方法中传入的容量增长量参数CapacityIncrement是否为0,如果不为0,就设置新的容量为就容量加上容量增长量,如果为0,就设置新的容量为旧的容量的2倍,如果设置后的新容量还不够,则直接新容量设置为传入的参数(也就是所需的容量),而后同样用Arrays.copyof()方法将元素拷贝到新的数组。

3.很多方法都加入了synchronized同步语句,来保证线程安全。

4.同样在查找给定元素索引值等的方法中,源码都将该元素的值分为null和不为null两种情况处理,Vector中也允许元素为null。

5.其他很多地方都与ArrayList实现大同小异,Vector现在已经基本不再使用。

你可能感兴趣的:(2018-08-08)