加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

ArrayList扩容

发布时间:2020-12-15 07:25:55 所属栏目:Java 来源:网络整理
导读:ArrayList有两个构造方法: 空参构造方法: 当实例化ArrayList没有传入参数时,创建一个长度为0,空的Object数组存储空间。(在调用add方法时,才会分配存储长度。) private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; public ArrayLi

ArrayList有两个构造方法:

空参构造方法:

当实例化ArrayList没有传入参数时,创建一个长度为0,空的Object数组存储空间。(在调用add方法时,才会分配存储长度。)

private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

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

有参构造方法:

在实例化时直接传入存储长度,以传入的长度为Object数组的长度。

    public ArrayList(int initialCapacity) {
        if (initialCapacity > 0) {
            this.elementData = new Object[initialCapacity];
        } else if (initialCapacity == 0) {
            this.elementData = EMPTY_ELEMENTDATA;
        } else {
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        }
    }

添加元素与扩容:

ArrayList使用一个size变量记录当前存储的元素个数。

当调用add方法时,会判断数组长度是否足够存储size+1个元素。

如果不足则调用grow方法进行扩容,每次扩容为旧数组长度的1.5倍。

扩容分为两步:

1.把旧数组中的元素复制到一个更大的新数组中。

2.把需要添加的元素添加到新数组中。

    public boolean add(E e) {
        //判断存储空间是否足够,不够则扩容
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        //最后添加传入的元素
elementData[size++] = e; return true; } private void ensureCapacityInternal(int minCapacity) { //calculateCapacity方法传入当前元素数,和需要的最小存储空间 ensureExplicitCapacity(calculateCapacity(elementData,minCapacity)); } private static int calculateCapacity(Object[] elementData,int minCapacity) { //如果当前存储元素的数组是默认的空数组 if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { //返回默认值10或需要的最小长度中的最大值。 return Math.max(DEFAULT_CAPACITY,minCapacity); } //如果不是默认的空数组,则直接返回需要的最小存储长度 return minCapacity; } private void ensureExplicitCapacity(int minCapacity) { modCount++; // overflow-conscious code //如果最小需求长度减去当前存储长度大于0则需要扩容 if (minCapacity - elementData.length > 0) //最终实现扩容的方法 grow(minCapacity); } private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; //oldCapacity >> 1 //右移运算符 原长度加上原长度的一半 也就是每次扩容是原来的1.5倍 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 elementData = Arrays.copyOf(elementData,newCapacity); }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读