栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Vector集合底层源码分析

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Vector集合底层源码分析

1、关于Vector集合,底层是一个对象数组,Vector类是线程同步的,因此线程安全,在一些关于集合的增删改查的方法上添加有synchronized,因此在开发中,涉及到多线程时,可以考虑使用Vector集合

2、关于Vector扩容的步骤如下

//Vector 源码解读
public class VectorDemo {

    public static void main(String[] args) {
        List vector = new Vector<>();
        for (int i = 1; i <= 10; i++) {
            vector.add(i);
        }
        vector.add(11);
        System.out.println(vector);
    }
}

在创建Vector对象处打上断点,开始进行测试,首先测试无参构造方法

 此时调用下面的构造方法

 然后继续调用构造方法

在该构造方法中elementData将会被初始化为容量为10的数组,

然后设置capacityIncrement = 0

然后进入add()方法 

进入add()方法前依旧将基本数据类型进行装箱

 

add()方法

 modCount参数表示修饰修改集合的次数 

然后调用 ensureCapacityHelper(elementCount + 1) 此时的elementCount初始值为0,类似ArrayList中的size属性。

 

进入 ensureCapacityHelper()

mincapacity = 1,然后elementData.length = 10(因为创建对象时,已经初始化了) 

显然if(1-10 > 0) 显然条件不成立,因此不会进行扩容。

然后当容量为10时,进行扩容的步骤如下 

依旧是这个方法,但是此时需要的容量为11了,即是minCapacity = 11。

 然后条件成立,进行扩容grow()方法

oldCapacity = 10,capacityIncrement = 0,因此三元表达式取后面的值,即是2倍原来的容量,因此从这点就可以看出来,Vector的扩容机制几乎和ArrayList一致,但是扩容的大小不相同。最后通过Arrays.copyOf()方法进行数组扩容。grow()执行完毕,最后返回add()进行元素赋值

打完收工

测试有参构造方法

public class VectorDemo1 {

    public static void main(String[] args) {
        List vector = new Vector<>(8);
        for (int i = 1; i <= 10; i++) {
            vector.add(i);
        }
        System.out.println(vector);
    }
}

 设置初始值为8,然后进行debug调试

 继续调用两个参数的构造方法

此时就会创建一个容量为8的数组元素赋值给elementData,然后capacityIncrement依旧为0 

后面依旧是熟悉的配方

  

进入ensureCapacityHelper()方法

此时minCapacity  =0,但是element.length = 8,if()条件不成立,依然不扩容 

然后当所需的最小容量为9时,进入grow()方法即进行扩容

 

此时条件成立,进入grow()方法进行扩容,与上面一样的配方,都是扩容为原来的两倍

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/284337.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号