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)