前言
最近在学习Java的集合框架,对ArrayList的实现原理很感兴趣,所有研究了一下源码,在此做下记录。
一、ArrayList是什么?
ArrayList就是动态数组,它是Array的复杂版本,提供了动态的增加和减少元素,实现了List接口。底层由数组实现。
二、初始容量
ArrayList里维护了一个常量空Object数组(static final,方法区上),若实例化对象的时候没有指定数组容量,则每个实例未添加元素前的elementData都指向这个默认空数组。elementData是ArrayList实例存放数据的数组。这样设计的好处是不必每次实例化一个ArrayList的时候都跟着实例化一个空数组,减少内存消耗。
当往ArrayList中添加第一个元素的时候,会在堆上新建一个长度为默认值10的数组,并添加数据进去。(即扩容,新容量为默认值10)
三、代码验证
这里通过输出添加第一个元素前后,ArrayList的elementData[]的长度各为多少来验证一下。由于elementData是默认访问权限,我们需要通过反射来获取,具体如下:
ArrayList<Integer> list=new ArrayList();
try {
Field field= ArrayList.class.getDeclaredField("elementData");
field.setAccessible(true);
System.out.println("添加第一个元素前数组的长度 :"+Array.getLength(field.get(list)) );
list.add(1);
System.out.println("添加元素");
System.out.println("添加第一个元素后数组的长度 :"+Array.getLength(field.get(list)));
} catch (Exception e) {
e.printStackTrace();
}
输出结果: