• Vector的扩容机制原理及源码分析


    1.初始化Vector无参构造器

    1.1 使用无参构造器创建Vector对象

    Vector vector = new Vector();

        源码分析:调用无参构造器,默认为Object数组赋予长度为10。

    1. public Vector() {
    2. this(10);
    3. }
    4. public Vector(int initialCapacity) {
    5. this(initialCapacity, 0);
    6. }
    7. //initialCapacity = 10;capacityIncrement=0
    8. public Vector(int initialCapacity, int capacityIncrement) {
    9. super();
    10. if (initialCapacity < 0)
    11. throw new IllegalArgumentException("Illegal Capacity: "+
    12. initialCapacity);
    13. //将initialCapacity = 10赋值给elementData数组的长度
    14. this.elementData = new Object[initialCapacity];
    15. this.capacityIncrement = capacityIncrement;
    16. }

    1.2 调用add(E e)方法添加数据

    源码分析:首次添加数据时,长度小于elementData数组的长度,不进行扩容,如果数据个数大于elementData数组长度,则进行扩容,扩容为elementData数组长度的2倍。

    1. for (int i = 0; i <10 ; i++) {
    2. vector.add(i);
    3. }
    4. public synchronized boolean add(E e) {
    5. modCount++;
    6. //判断是否需要扩容
    7. ensureCapacityHelper(elementCount + 1);
    8. elementData[elementCount++] = e;
    9. return true;
    10. }
    11. private void ensureCapacityHelper(int minCapacity) {
    12. // overflow-conscious code
    13. //此时minCapacity大小<=10 不进行扩容,否则进行扩容
    14. if (minCapacity - elementData.length > 0)
    15. grow(minCapacity);
    16. }
    17. private void grow(int minCapacity) {
    18. // elementData.length = 10
    19. int oldCapacity = elementData.length;
    20. //newCapacity = 10;capacityIncrement =0
    21. //三位运算符 此时newCapacity = oldCapacity + oldCapacity 值,即为原先的2倍
    22. int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
    23. capacityIncrement : oldCapacity);
    24. if (newCapacity - minCapacity < 0)
    25. newCapacity = minCapacity;
    26. if (newCapacity - MAX_ARRAY_SIZE > 0)
    27. newCapacity = hugeCapacity(minCapacity);
    28. elementData = Arrays.copyOf(elementData, newCapacity);
    29. }

    结论:调用无参构造器,默认为elementData数组赋予长度为10,需再次扩容时,扩为elementData数组长度的2倍。

    2.初始化Vector有参构造器

    2.1 使用有参构造器创建Vector对象

            源码分析:使用有参构造器创建Vector对象,创建了一个固定大小的elementData数组。

    1. Vector vector2 = new Vector(8);
    2. //initialCapacity = 8
    3. public Vector(int initialCapacity) {
    4. this(initialCapacity, 0);
    5. }
    6. //initialCapacity = 8 ;capacityIncrement = 0
    7. public Vector(int initialCapacity, int capacityIncrement) {
    8. super();
    9. if (initialCapacity < 0)
    10. throw new IllegalArgumentException("Illegal Capacity: "+
    11. initialCapacity);
    12. //将初始化的大小赋值给elementData数组的长度
    13. this.elementData = new Object[initialCapacity];
    14. this.capacityIncrement = capacityIncrement;
    15. }

    1.2 调用add(E e)方法添加数据

    源码分析:添加数据时,数据的个数小于elementData数组的长度,不进行扩容,如果数据个数大于elementData数组长度,则进行扩容,扩容为elementData数组长度的2倍。

    1. for (int i = 0; i < 8; i++) {
    2. vector2.add(i);
    3. }
    4. //进行扩容
    5. vector2.add(8);
    6. public synchronized boolean add(E e) {
    7. modCount++;
    8. ensureCapacityHelper(elementCount + 1);
    9. elementData[elementCount++] = e;
    10. return true;
    11. }
    12. private void ensureCapacityHelper(int minCapacity) {
    13. // overflow-conscious code
    14. if (minCapacity - elementData.length > 0)
    15. grow(minCapacity);
    16. }
    17. private void grow(int minCapacity) {
    18. // overflow-conscious code
    19. int oldCapacity = elementData.length;
    20. int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
    21. capacityIncrement : oldCapacity);
    22. if (newCapacity - minCapacity < 0)
    23. newCapacity = minCapacity;
    24. if (newCapacity - MAX_ARRAY_SIZE > 0)
    25. newCapacity = hugeCapacity(minCapacity);
    26. elementData = Arrays.copyOf(elementData, newCapacity);
    27. }

    结论:调用有参构造器,创建了一个固定大小的elementData数组,需再次扩容时,扩为elementData数组长度的2倍。

    3.总结

            1)调用无参构造器,默认为elementData数组赋予长度为10,需再次扩容时,扩为elementData数组长度的2倍。

            2)调用有参构造器,创建了一个固定大小的elementData数组,需再次扩容时,扩为elementData数组长度的2倍。

  • 相关阅读:
    用户组的概念(linux篇)
    我把MySQL运行在Docker上,差点完了……
    windows下VS配置NISwGSP
    uniapp制作h5小程序中双列下拉查询
    字符串匹配之KMP讲解 及 与C++string类中的substr()的时间复杂度比较
    HyperLynx(十九)DDR(二)DDR的地址仿真
    C++-封装unordered
    Symfony 控制台命令教程
    Java#18(面向对象三大特征之一:继承)
    科技成果验收测试需注意哪些方面?
  • 原文地址:https://blog.csdn.net/hzz_321/article/details/126897922