ArrayList对象扩容长度变化

1.new ArrayList<>(0)的扩容

ArrayList的初始化分为带参数的new ArrayList<>(len)和new ArrayList<>()。对于ArrayList的初始长度一般是10。这里介绍一下ArrayList的初始化长度的情况。首先是附上ArrayList的源码:

    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);
        }
    }

new Arraylist<>(0)的时候,初始化是一个长度为0的空数组,当进行add(1)等操作时,数组长度会进行扩容,扩容的机制是如下:

1.针对的是当长度为0,1时。将旧的长度和扩展长度(旧长度左移操作,除2操作)形成新的长度,将新的长度与数组存储数据需要的长度进行比较,当新长度不满足条件时,新的数组长度设置为满足存储的最小长度。

2.针对之后的旧的长度时,长度拓展为旧长度加上和扩展长度(旧长度左移操作,除2操作)形成新的长度。这种情况基本上是旧的长度的1.5倍。

故new Arraylist<>(0)的长度随着数据的添加,长度变化是0,1,2,3,4,6,9,13……

2.new ArrayList<>()的扩容

对于new ArrayList<>()的扩容,初始化时,数组也是一个长度为0的空数组,当进行数据的添加时,添加第一个数据时,数组会被开辟一个长度为10的数组空间,然后数组长度不变,直至数组的剩余空间被全部使用,即添加第11个数据时,数组才会开始扩容到15,将数据存储下来。初始化为new ArrayList<>()设置的源代码如下:

    private static int calculateCapacity(Object[] elementData, int minCapacity) {
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            return Math.max(DEFAULT_CAPACITY, minCapacity);
        }
        return minCapacity;
    }

3.new ArrayList<>(num)的扩容(num > 0)

对于new ArrayList<>(num)的扩容,初始化时,数组也是一个长度为num的空数组,然后数组长度不变,直至数组的剩余空间被全部使用,数组才会开始扩容到1.5倍,将数据存储下来。

4.new ArrayList<>(-1)的扩容(num < 0)

对于new ArrayList<>(num)来说,初始化是不合法的,因此如果未按照要求初始化,程序会在执行时直接抛出异常。

源代码如下

    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);
        }
    }

在程序中如此声明,运行时错误如下:

Exception in thread "main" java.lang.IllegalArgumentException: Illegal Capacity: -1
	at java.util.ArrayList.<init>(ArrayList.java:157)
	at com.example.MyMainTest.main(MyMainTest.java:12)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值