Java集合框架是十分重要且具有学习意义的,今天对它的List接口下的ArrayList实现类的扩容机制进行深入学习,这篇文章也就应运而生。
目录
开始
ArrayList底层其实就是一个简单的用于存储Object类型的数组,如果不加以设置,那么初始化长度是0
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
其中 DEFAULTCAPACITY_EMPTY_ELEMENTDATA 是长度为0的空数组。
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
那么ArrayList是什么时候初始化容量的呢?由ArrayList的源码文档可知,当添加第一个元素时,任何带有 elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA 的空 ArrayList 都将扩展到 DEFAULT_CAPACITY。

而这个 DEFAULT_CAPACITY 是什么呢?下面由一个小 demo ,带着我们一起去了解一下。
public class test01 {
public static void main(String[] args) {
outOfIndexWithAddOne();
//
}
private static void outOfIndexWithAddOne() {
ArrayList<String> list = new ArrayList<>();
list.add("你好");
String[] strs = {"a","a","a","a","a","a","a","a","a"};
list.addAll(Arrays.asList(strs));
// -----------------------------------
list.add("你好啊"); //TODO expanding the previous capacity.
System.out.println(list);
}
}
当调用 add() 方法向 ArrayList 中添加进第一个元素,数组的扩容机制就开始工作了。
public boolean add(E e) {
modCount++;
add(e, elementData, size);
return true;
}
//
private void add(E e, Object[] elementData, int s) {
if (s == elementData.length)
elementData = grow();
elementData[s] = e;
size = s + 1;
}
//
private Object[] grow() {

3473

被折叠的 条评论
为什么被折叠?



