Vector源码
1. Vector属性
//储存Vector元素的数组
protected Object[] elementData;
//Vector元素的数量
protected int elementCount;
//Vector扩容增加的容量
protected int capacityIncrement;
//数组最大的大小
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
从Vector的属性就可以看出,Vector的是由数组实现的,主要通过操作elementData数组来实现。
2. 线程安全
Vector绝大多数的方法都加有synchronized关键字,因此Vector是线程安全的列表。
3. 扩容算法
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
//如果capacityIncrement>0,每次扩容增加capacityIncrement这么多;否则,容量翻倍
int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
capacityIncrement : oldCapacity);
// 如果新容量还是小于要求的最小容量,则容量取要求的最小容量
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
// 如果新容量大于最大容量,特殊处理
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
一般情况下,扩容分为两种情况,第一种是初始化Vector指定capacityIncrement,且为正数,则每次扩容增加capacityIncrement;另一种情况是,初始化未指定capacityIncrement,则每次扩容的容量翻倍。
4.大多数的方法实现思路与ArrayList如出一辙
Vector和ArrayList都是操作数组来实现列表,因此其实现的逻辑基本一致。
结论
Vector与ArrayList的底层都是由数组实现,必要时可扩容。都可以类比成一个大小可变的数组,因此可以根据下标查找值,非常高的效率。但是删除或者从中删除节点,需要对很多元素进行修改,效率不是很高。Vector与ArrayList不一样的地方就是Vector大多数的方法加有synchronized关键字,是线程安全的。
相关链接
ArrayList源码:https://blog.csdn.net/weixin_43177753/article/details/122002504
本人萌新一枚,才疏学浅,如有不足之处和错误的地方,还望各位大神指出。
欢迎大家评论讨论,一起进步。