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);
}
}
/**
* Constructs an empty list with an initial capacity of ten.
* 构造一个初始容量为10的空列表
*/
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
测试
@Test
public void arrayListTest() {
//无参构造
List<Integer> list = new ArrayList<>();
//初始容量为0
System.out.println(getArrayListCapacity(list));//0
//添加一个元素后初始容量变为10
list.add(1);
System.out.println(getArrayListCapacity(list));//10
//有参构造初始为0
List<Integer> list1 = new ArrayList<>(0);
//初始容量为0
System.out.println(getArrayListCapacity(list1));//0
//添加一个元素后初始容量变为1
list1.add(1);
System.out.println(getArrayListCapacity(list1));//1
}
public int getArrayListCapacity(List<Integer> arrayList) {
Class<ArrayList> arrayListClass = ArrayList.class;
try {
Field field = arrayListClass.getDeclaredField("elementData");
field.setAccessible(true);
Object[] objects = (Object[]) field.get(arrayList);
return objects.length;
} catch (NoSuchFieldException e) {
return -1;
} catch (IllegalAccessException e) {
e.printStackTrace();
return -1;
}
}
- 小结 ArrayList可以自动扩容,不传初始容量或者初始容量是0,都会初始化一个空数组,但是如果添加元素,会自动进行扩容,所以,创建ArrayList的时候,给初始容量是必要的
扩容是原有容量大小的1.5倍进行向下取整。
扩容时是新建一个list,然后将原有的数据复制过去。