3-Vector底层结构和源码分析
3-Vector底层结构和源码分析
介绍汇总:
- Vector的基本介绍
- Vector的运行重要步骤
- 底层结构和 ArrayList 的比较
1-Vector的基本介绍
- 定义说明
- Vector 底层也是一个对象数组,protected Object[] elementData ;
- Vector 是线程同步的,即线程安全,Vector 类的操作方法带有 synchronized 。
public synchronized E set(int index, E element) {
if (index >= elementCount)
throw new ArrayIndexOutOfBoundsException(index);
E oldValue = elementData(index);
elementData[index] = element;
return oldValue;
}
- 在开发中,需要线程同步安全是,考虑使用 Vector 。
2-Vector的运行重要步骤
-
Vector 构造器(三种)
无参构造器
public Vector() { this(10); } // 此无参构造器会调用一参构造器,并且初始容量大小为 10 ,容量增量大小为 0
一参构造器
public Vector(int initialCapacity) { this(initialCapacity, 0); } // 此一参构造器会调用两参构造器,并且初始容量为指定大小,容量增量大小为 0
两参构造器
public Vector(int initialCapacity, int capacityIncrement) { super(); if (initialCapacity < 0) throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); this.elementData = new Object[initialCapacity]; this.capacityIncrement = capacityIncrement; } // 此两参参构造器的初始容量为指定大小,容量增量也为指定大小
总结
从这三个构造器可以发现,核心是两参构造器,也是自由度最高的,可以指定初始容量,以及容量增量,这就代表之后扩容的话,以容量增量 + 原来的容量进行扩容(当然遇到这种方式无法满足扩容要求,就会采用其他方式,看源码);其次自由度最高的是一参构造器,可以指定初始容量,但容量增量为 0 ,这就代表之后扩容的话,以原来的容量的二倍进行扩容(当然遇到这种方式无法满足扩容要求,就会采用其他方式,看源码);然后自由度最低的,无参构造器,初始容量为默认容量 10 ,但容量增量为 0 ,其扩容方式与一餐构造器一致。
-
扩容过程
3- 底层结构和 ArrayList 的比较
集合 | 底层结构 | 版本 | 线程安全(同步)效率 | 扩容倍数 |
---|---|---|---|---|
ArrayList | 可变数组 | jdk1.2 | 不安全,效率高 | 如果有参构造1.5倍如果无参初始化后第一次为10第二次开始按1.5倍 |
Vector | 可变数组Object[] | jdk1.0 | 安全,效率不高 | 若是无参或一参,按原本的容量的2倍扩;若是两参,按原本的容量 + 增加容量扩 |