环境和版本

  • Mac M1
  • IDEA 2021
  • Zulu Open JDK

    简介

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

  1. <a name="H4Rbn"></a>
  2. # 扩容方法
  3. ```java
  4. // 扩容辅助方法
  5. private void ensureCapacityHelper(int minCapacity) {
  6. // overflow-conscious code
  7. if (minCapacity - elementData.length > 0)
  8. grow(minCapacity);
  9. }
  10. // 扩容方法
  11. private void grow(int minCapacity) {
  12. // overflow-conscious code
  13. int oldCapacity = elementData.length;
  14. // 如果使用默认构造函数 capacityIncrement = 0 则每次扩容2倍
  15. // 如果使用 Vector(int initialCapacity, int capacityIncrement) 构造函数
  16. // 如果 capacityIncrement <= 0 则每次扩容2倍
  17. // 否则,则是 oldCapacity + capacityIncrement
  18. int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
  19. capacityIncrement : oldCapacity);
  20. // 以下和ArrayList类似
  21. if (newCapacity - minCapacity < 0)
  22. newCapacity = minCapacity;
  23. if (newCapacity - MAX_ARRAY_SIZE > 0)
  24. newCapacity = hugeCapacity(minCapacity);
  25. elementData = Arrays.copyOf(elementData, newCapacity);
  26. }
  27. private static int hugeCapacity(int minCapacity) {
  28. if (minCapacity < 0) // overflow
  29. throw new OutOfMemoryError();
  30. return (minCapacity > MAX_ARRAY_SIZE) ?
  31. Integer.MAX_VALUE :
  32. MAX_ARRAY_SIZE;
  33. }