Java容器五:Vector

来源:互联网 发布:去人声软件 编辑:程序博客网 时间:2024/05/22 17:03

Vector

List, RandomAccess, Cloneable, Serializable
–>AbstractList –>AbstractCollection


VectorArrayList的实现类似,只是将所有方法都加上了synchronized保证了线程安全。同样,Vector也是fail-fast的。

成员变量

底层同样通过数组实现。增加和删除操作都通过Arrays.copyOf方法实现。

// 底层数组protected Object[] elementData;// 储存的数据数量protected int elementCount;// 每次增加的数组大小protected int capacityIncrement;

初始化及扩容

初始化

初始化参数写死在了构造函数中,并且数组初始化开辟内存空间是在构造函数中进行的。默认初始化数组大小为10。

public Vector() {    this(10);}public Vector(int initialCapacity) {    this(initialCapacity, 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;}

扩容

若有初始化扩容值,则将现有数组大小加上扩容值成为新的数组大小,若没有初始化扩容值,则将数组空间扩大两倍。

private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;private void grow(int minCapacity) {    // overflow-conscious code    int oldCapacity = elementData.length;    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);}private static int hugeCapacity(int minCapacity) {    if (minCapacity < 0) // overflow        throw new OutOfMemoryError();    return (minCapacity > MAX_ARRAY_SIZE) ?        Integer.MAX_VALUE :        MAX_ARRAY_SIZE;}

最大数组长度的选取

可以看到,在ArrayList,Vector或HashMap等底层通过数组实现的容器其最大数组长度设置的值均为MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8,Java中数组需要一部分空间储存数组自己本身的信息(数组大小,存储的数据类型),因此不能将index直接赋为Integer.MAX_VALUE,而是需要部分index来定位本身的信息,这一部分的大小是由特定的JVM虚拟机决定的。
What is in java object header
因此将最大长度设置为Integer.MAX_VALUE - 8,且在超过最大长度后尝试使用Integer.MAX_VALUE分配空间,若JVM不支持该带大小,将会抛出异常。

0 0