实验代码:
public void test01() {
ArrayList<String> strings = new ArrayList<>();
for (int i = 0; i < 40; i++) {
strings.add(String.valueOf(i + 1));
System.out.println("元素个数为:" + strings.size() + "\t容量为:" + getElementDataLength(strings));
}
}
public int getElementDataLength(ArrayList<String> arr) {
Class<ArrayList> arrayListClass = ArrayList.class;
try {
//获取 elementData 字段
Field field = arrayListClass.getDeclaredField("elementData");
//开始访问权限
field.setAccessible(true);
//把示例传入get,获取实例字段elementData的值
Object[] objects = (Object[])field.get(arr);
//返回当前ArrayList实例的容量值
return objects.length;
} catch (Exception e) {
e.printStackTrace();
return -1;
}
}
结论:
arraylist实例化后,默认数组(elementData)长度(即容量)为0,在添加第一个元素时,数组长度(容量)会扩容为10。,每次添加元素时都会判断数组长度(容量)是否等于元素个数,若数组已满,则扩容。
扩容:
每次扩容为原容量的1.5倍,取整数部分。按照新的容量初始化数组后,将原有数组内容复制到新数组中去,扩容完毕。
(移除元素时,容量不会改变)。