集合框架之ArrayList源码分析(JDK1.8)

ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable

ArrayList继承自AbstractList,这和Vector是一样的,实现了List接口,所以兼具两者的方法。

ArrayList<Integer> list = new ArrayList<>();

当我们new一个无参数的对象时,此时初始化一个空数组,并不是初始化一个长度为10的数组

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

接下来我们看看add方法

public boolean add(E e) {
    ensureCapacityInternal(size + 1);  // Increments modCount!首先确保数组的长度足够使用,元素的个数小于数组的长度
    elementData[size++] = e;
    return true;
}

我们看看ensureCapacityInternal做了什么,初始化的 size=0

private void ensureCapacityInternal(int minCapacity) {  // minCapacity=0   elementData实际的数组数据
    ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}

在看ensureExplicitCapacity做了什么之前先看看calculateCapacity做了什么

private static int calculateCapacity(Object[] elementData, int minCapacity) {  // minCapacity=0
    if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {  // elementData 第一次调用时为空{}
        return Math.max(DEFAULT_CAPACITY, minCapacity);
    }
    return minCapacity;
}

上面的方法可以看出返回了一个新的int类型的数字,而这个数字就是默认的10;

接下来的调用

private void ensureExplicitCapacity(int minCapacity) {
    modCount++;

    // overflow-conscious code
    if (minCapacity - elementData.length > 0)
        grow(minCapacity);
}
private void grow(int minCapacity) { // 扩容
    // overflow-conscious code
    int oldCapacity = elementData.length; // 原来数组的长度
    int newCapacity = oldCapacity + (oldCapacity >> 1); // 新的数组长度=原来的数组长度+原来数组长度的一半
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    // minCapacity is usually close to size, so this is a win:
    elementData = Arrays.copyOf(elementData, newCapacity); // 把原来数组里的数组复制到新的数组里面
}
private static int hugeCapacity(int minCapacity) { // 巨大空间 返回Integer的最大值
    if (minCapacity < 0) // overflow
        throw new OutOfMemoryError();
    return (minCapacity > MAX_ARRAY_SIZE) ?
        Integer.MAX_VALUE :
        MAX_ARRAY_SIZE;
}

至此,ArrayList的添加数据的过程接结束了。

ArrayList里面的数组的长度对外是不公开的,也就是你无法通过其他办法获取存储数据的数组的长度,size()方法只能获取已经存的数据的个数。

该文章以后还会继续更新。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值