ArrayList的构造

ArrayList有三个构造方法:

1、无参构造

2、利用其它构建

3、指定顺序表初始容量

无参构造的源码分析

public ArrayList() {
    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

上面是ArrayList()无参构造的源码。那么elementData 和 DEFAULTCAPACITY_EMPTY_ELEMENTDATA是啥呢?我们接着找。

transient Object[] elementData; // non-private to simplify nested class access
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

看到上面两行源码,我们可以得出elementData是一个没有指向数组的索引。DEFAULTCAPACITY_EMPTY_ELEMENTDATA是一个大小为0的数组

在无参构造中的:this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;这行代码表示让elementData 存储大小为0的数组的索引。

public boolean add(E e) {
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    elementData[size++] = e;
    return true;
}

ensureCapacityInternal(size + 1);这个方法源码的注释是递增模数!!。其实就和我们在顺序表中判断其是否满了然后扩容这个操作是十分相似 的。我们接下来看一下他的源码:

private void ensureCapacityInternal(int minCapacity) {
    ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}

 

如果想要了解ensureCapacityInternal就必须要了解ensureExplicitCapacity和calculateCapacity的源码

查看calculateCapacity源码 (中文注释为我的解释):

private static int calculateCapacity(Object[] elementData, int minCapacity) {
    //DEFAULTCAPACITY_EMPTY_ELEMENTDATA是ArrayList进行无参初始化的时候
    //给其赋值的一个大小为0的数组。没有发生什么特殊的变化则是可以进入这个判断
    if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
        //private static final int DEFAULT_CAPACITY = 10;
        //上一行是DEFAULT_CAPACITY的源码,
        //下面一行代码是DEFAULT_CAPACITY,和minCapacity哪个值最大所比较
        return Math.max(DEFAULT_CAPACITY, minCapacity);//返回的是:10和1比较最大的10
    }
    return minCapacity;
    //若是传入的大小大于10的话返回的就是传入的minCapacity数值
}

查看ensureExplicitCapacity(calculateCapacity源码(中文注释为我的解释):

private void ensureExplicitCapacity(int minCapacity) {//minCapacity是10
    modCount++;
    
    // overflow-conscious code
    if (minCapacity - elementData.length > 0)
        //minCapacity的大小为10,elementData.length的大小为0 这个判断语句可以进入
        grow(minCapacity);
}

 

查看grow源码(中文注释为我的解释):

private void grow(int minCapacity) {//minCapacity 为 10 
    // overflow-conscious code
    int oldCapacity = elementData.length;//oldCapacity 大小为 0
    //newCapacity 大小oldCapacity的1.5倍为 0
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    //newCapacity - minCapacity的值为 -10 这个判断能够给进入
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;//newCapacity 为 10
    //这个判断语句进不去,MAX_ARRAY_SIZE是一个很大的值newCapacity - MAX_ARRAY_SIZE < 0
    //这个判断的作用在下面详解add源码的时候再解释
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    // minCapacity is usually close to size, so this is a win:
    //newCapacity的值为10,elementData扩容大小为10
    elementData = Arrays.copyOf(elementData, newCapacity);
}

 

 

 

文章链接: https://www.mfisp.com/22435.html

文章标题:ArrayList的构造

文章版权:梦飞科技所发布的内容,部分为原创文章,转载请注明来源,网络转载文章如有侵权请联系我们!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

给TA打赏
共{{data.count}}人
人已打赏
建站教程

查看数组的大小

2023-7-25 13:27:13

建站教程

其他构造的源码分析

2023-7-26 14:30:42

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
客户经理
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索

梦飞科技 - 最新云主机促销服务器租用优惠