环境和版本
- Mac M1
- IDEA 2021
-
简介
Vector实现了List接口,是顺序容器,即元素存存放的数据与放进去的顺序相同,允许放进入 null 元素。底层通过 数组 实现。
其所有的方法都是同步方法,使用 synchronized 修饰
学习内容
Vector大部分的操作都和ArrayList一致,只是源码层次的实现有些差别,其原理一致,所以我们只需要看不同的部分即可。
构造函数
```java // 默认就是10 public Vector() { this(10); }
public Vector(int initialCapacity) { this(initialCapacity, 0); }
// initialCapacity 初始化大小 // capacityIncrement 一次扩容多大 // 如果 capacityIncrement 为0,则扩容 initialCapacity * 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; }
public Vector(Collection<? extends E> c) { Object[] a = c.toArray(); elementCount = a.length; if (c.getClass() == ArrayList.class) { elementData = a; } else { elementData = Arrays.copyOf(a, elementCount, Object[].class); } }
<a name="H4Rbn"></a># 扩容方法```java// 扩容辅助方法private void ensureCapacityHelper(int minCapacity) {// overflow-conscious codeif (minCapacity - elementData.length > 0)grow(minCapacity);}// 扩容方法private void grow(int minCapacity) {// overflow-conscious codeint oldCapacity = elementData.length;// 如果使用默认构造函数 capacityIncrement = 0 则每次扩容2倍// 如果使用 Vector(int initialCapacity, int capacityIncrement) 构造函数// 如果 capacityIncrement <= 0 则每次扩容2倍// 否则,则是 oldCapacity + capacityIncrementint newCapacity = oldCapacity + ((capacityIncrement > 0) ?capacityIncrement : oldCapacity);// 以下和ArrayList类似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) // overflowthrow new OutOfMemoryError();return (minCapacity > MAX_ARRAY_SIZE) ?Integer.MAX_VALUE :MAX_ARRAY_SIZE;}
