java源码学习-Vector

1、Vector类

1.继承AbstractList
2.实现 List<E>, RandomAccess, Cloneable, java.io.Serializable 接口

2、Vector作用

1.利用数组作为存储结构,但是提供了对数组进行扩容的方法,实现可变长度,不再关心数组长度是否够用的问题。

3、Vector属性

protected Object[] elementData;//存储数据元素的数组
protected int elementCount;//数组中存储元素的个数
protected int capacityIncrement;//数组扩容增长量

关注属性的权限修饰符为protected,说明该类的子类可以直接访问这些属性。
elementData是对象数组,说明Vector存入的是对象类型,而不是基本数据类型,如果要存入int,float,long 等数据类型需要存入的是其包装类。
elementCount与capacityIncrement是int类型的变量,说明在没有赋值的情况下其值均为0

4、Vector构造方法

4.1 构造方法
1. public Vector(int initialCapacity, int capacityIncrement);
 	两个参数分别为:初始化容量,扩容增加量
 	该方法是最终初始化数组和扩容增长量的方法。
 	初始化容量不能为负数,当初始化容量为负数的时候会抛出IllegalArgumentException异常。
 	扩容增长量来说该值没有做任何限制,也就是说可以为负数
2. public Vector(int initialCapacity);
 	参数为:初始化容量
	扩容增加量使用默认为0
3. public Vector();
	初始化容量使用默认为10
	扩容增加量使用默认为0
4. public Vector(Collection<? extends E> c)
	将传入的集合转换为数组并存入现在的数组中
4.2 构造方法相关问题思考
1.1 当初始化容量为0的时候,是如何确保添加元素的时候能够加入到数组中?
1.2 当扩容增长量为0和负数的时候,是如何保证数组能够有效扩容,扩容的大小是多少?

5、Vector的方法

5.1 确保最小容量方法
public synchronized void ensureCapacity(int minCapacity);

该方法用于保证elementDatas数组大小能够存储加入的数据,minCapacity是数组的最小容量。
1.1 权限修饰符  为 public
	说明在使用Vector的时候可以在需要传入一个数组最小容量。
1.2 方法使用synchronized修饰说明是线程安全的。
1.3 方法中进行判断只有当传入的值大于0时才会进行扩容,调用ensureCapacityHelper

private void ensureCapacityHelper(int minCapacity);

该方法为真正确保最小容量的方法。
1.1 权限修饰符为 private
	该方法只能在Vector类中使用,如果要手动扩容则需要使用ensureCapacity方法,不能直接使用ensureCapacityHelper
1.2 如果传入的数组的最小容量大于当前数组存储元素的大小则进行扩容操作,否则不进行扩容。调用grow方法
5.2 扩容方法
 private void grow(int minCapacity);
 
 该方法用于对当前存储数据数组的扩容。
 1.1 权限修饰符为 private
 	该方法只能在Vector类中使用
 1.2 传入的值为希望存储数据数组的最小容量
 
 1.3 扩容源码逻辑分析:
  private void grow(int minCapacity) {//传入的值为希望的数组大小
    // overflow-conscious code
    int oldCapacity = elementData.length;// 当前数据数组中元素的个数

	//如果扩容增长量为正数,则新的容量为当前元素个数加上扩容增长量
	//如果扩容增长量不为正数,则新的容量为当前元素个数的二倍
    int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                     capacityIncrement : oldCapacity);
                                     
	//如果过扩容后的数组的大小(newCapacity)小于了希望的数组大小(minCapacity),则新的数组容量为希望的数组大小(minCapacity)
	//否则数组大小为 newCapacity
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
        
	//MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8
	//判断要使用的数组大小大于了MAX_ARRAY_SIZE,则数组大小变为Integer.MAX_VALUE
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    elementData = Arrays.copyOf(elementData, newCapacity);
}

1.4 结论:
1.4.1 Vector中数组的最大个数为Integer.MAX_VALUE。
1.4.2 当扩容增长量为0和负数时,数组大小以当前数据数组中元素的个数的二倍增涨,直到数组大小变为Integer.MAX_VALUE
1.4.3 当希望的数组大小小于了系统扩容后的数组大小,则传入的希望的数组大小失效
5.2 添加元素
 public synchronized void addElement(E obj) {
    modCount++;
    ensureCapacityHelper(elementCount + 1);
    elementData[elementCount++] = obj;
}

当初始化容量为0的时候,调用的是ensureCapacityHelper方法,会初始化一个容量为1的数组大小。。

猜你喜欢

转载自blog.csdn.net/shan_zhi_jun/article/details/82945687