Vector源码解析

2023/11/26 Java集合框架

# 1、Vector详解说明

这里不再解释Vector过多的源码,因为Vector的源码实现上跟ArrayList类似,想了解可以去自己去查看。这里只做个总结说明:

  • synchronized

Vector是线程安全的,Vector提供的方法都加上了synchronized关键字,性能上比ArrayList差一点,因为多了一个锁。

源码

public synchronized boolean add(E e) {
    modCount++;
    ensureCapacityHelper(elementCount + 1);
    elementData[elementCount++] = e;
    return true;
}

public synchronized E get(int index) {
    if (index >= elementCount)
        throw new ArrayIndexOutOfBoundsException(index);

    return elementData(index);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
  • 扩容机制

Vector的扩容最小扩容为原来的2倍。

源码

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 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);
}

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

public Vector() {
    this(10);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

# 2、Vector和ArrayList的区别

  • Vector是线程安全的,ArrayList是非线程安全的。因此ArrayList效率比Vector高。
  • Vector自动扩容最小是原来的2倍,而ArrayList是原来的1.5倍。