Java集合 - List之Vector扩容详解

Vector简介

Vector是Java中Collection集合实现类之一,底层由Object数组实现。与array数组相比,它具有动态扩展的能力(动态扩容)。

Vector继承关系

public class Vector<E>
    extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable

Vector类继承AbstractList(抽象类),实现了List接口,Cloneable接口(克隆),RandomAccess接口(随机访问),Serializable接口(序列化)。

List接口继承了Collection接口,Collection接口继承了Iterable接口,故Vector是Collection接口的实现子类,同样也是Iterable接口(迭代器)的实现子类,同时具有迭代器的方法。

Vector list = new Vector(3);
list.add(1);
list.add(2);
list.add(3);
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
	Object next = iterator.next();
	System.out.println(next);
}

Vector源码分析

重要的成员变量如下:

//真正存放element的数组
protected Object[] elementData;

//数组的真实长度
protected int elementCount;

//向量增量
protected int capacityIncrement;

1.无参构造

/**
* 当调用Vector无参构造器时,底层elementData数组被初始化为一个长度为10的空数组
*/
public Vector() {
        this(10);
}

2.有参构造


public Vector(int initialCapacity) {
    this(initialCapacity, 0);
}


/**
 * 当入参initialCapacity大于0时,底层elementData数组会被初始化为指定大小的Object数组
 * 当入参initialCapacity等于0时,底层elementData数组会被赋值为一个空数组
 * 当入参initialCapacity小于0时,直接抛IllegalArgumentException异常
 * capacityIncrement的值为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;
}

3.add(E e)方法

//首先add方法被synchronized修饰,表示该方法是线程安全的
public synchronized boolean add(E e) {
	//与ArrayList的add方法一样,modCount 表示修改次数。每次新增对象就会加1
	modCount++;
	
	//elementCount表示底层数组中存放对象的真实数量,每次新增对象时,真实数量就要加1
	ensureCapacityHelper(elementCount + 1);
	elementData[elementCount++] = e;
	return true;
}


private void ensureCapacityHelper(int minCapacity) {
	
	// minCapacity表示最小容量,假如原来数组中有10个对象,那么新增1个对象,那么最小容量就是11,否则装不下
	// 最小容量减去数组的真实容量,如果大于0,就执行扩容操作
	if (minCapacity - elementData.length > 0)
	
		//真正扩容的方法,grow 表示 生长的意思
		grow(minCapacity);
}


private void grow(int minCapacity) {
	
	// 获取数组的真实容量(实际存放成员的个数)
	int oldCapacity = elementData.length;
	
	// 由于capacityIncrement = 0 ,因此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);
	// 将数组容量扩容至原来的2倍,并保留原数据
	elementData = Arrays.copyOf(elementData, newCapacity);
}

add方法总结:

1.调用无参构造器创建Vector

        ①首次将底层数组的容量先被初始化为10。

        ②当Vector底层数组被填满后,再次add对象时,底层数组的容量会扩容至原来的2倍,并将原数组数据拷贝进来。

3.调用有参构造器创建Vector

        ①首先将底层数组初始化为指定入参的大小。

        ②当ArrayList底层数组被填满后,再次add对象时,底层数组的容量会扩容至原来的2倍,并将原数组数据拷贝进来。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值