实例代码
//无参构造器
Vector vector = new Vector();
//有参构造
//Vector vector = new Vector(8);
for (int i = 0; i < 10; i++) {
vector.add(i);
}
vector.add("ChanV");
System.out.println("vector = " + vector);
在此处打一个断开,开始debug
一、构造函数
1.1、指定容器大小的情况
//调用有参构造,然后带着指定的容器大小去调用另一个有参构造方法
public Vector(int initialCapacity) {
this(initialCapacity, 0);
}
//有参构造器
public Vector(int initialCapacity, int capacityIncrement) {
super();
//如果指定容器的大小为负数,就抛出异常
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
//创建一个指定容量的数组然后赋值给elementData
this.elementData = new Object[initialCapacity];
//capacityIncrement 恒等于0
this.capacityIncrement = capacityIncrement;
}
1.2、指定容器大小的情况
//无参构造方法,就是默认指定容量为10然后去调用有参构造方法
public Vector() {
this(10);
}
接下来的过程跟有参构造的情况就是一样的了
二、将基本数据类型装箱为引用数据类型
因为Java集合只能存放引用数据类型,所以有一个将基本数据类型装箱为引用数据类型的过程
三、判断此时的容量够不够
public synchronized boolean add(E e) {
//记录容器被修改的次数
modCount++;
//判断容器是否足够大的方法
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = e;
return true;
}
private void ensureCapacityHelper(int minCapacity) {
// overflow-conscious code
//需要的最小长度减去当前容器的大小 > 0,
//说明当前容量不够,进入到grow方法进行扩容
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
四、开始扩容
private void grow(int minCapacity) {
// overflow-conscious code
//把当前容器的大小赋值给oldCapacity
int oldCapacity = elementData.length;
//因为capacityIncrement恒为0,> 0 永不成立,
//所以就是 int newCapacity = oldCapacity + oldCapacity
//这就意味着当容器的容量不够时,容量为扩容到原来的两倍
int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
capacityIncrement : oldCapacity);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
//随后调用Arrays.copyOf对原来的容器进行扩容
elementData = Arrays.copyOf(elementData, newCapacity);
}
五、总结ArraysList 和 Vector
5.1、ArrayList
- 底层结构:可变数组
- 版本:JDK1.2
- 线程安全效率:不安全,效率高
- 扩容倍数:如果有参构造扩容 1.5 倍;如果是无参构造,第一次指定容量为10,从第二次开始按原来的 1.5 倍扩容
5.2、Vector
- 底层结构:可变数组
- 版本:JDK1.0
- 线程安全效率:安全,效率不高
- 扩容倍数:如果有参构造扩容 2 倍;如果是无参构造,第一次指定容量为10,从第二次开始按原来的 2 倍扩容