ArrayList
ArrayList是.Net Framework提供的用于数据存储和检索的专用类,它是命名空间System.Collections下的一部分。它的大小是按照其中存储的数据来动态扩充与收缩的。所以,我们在声明ArrayList对象时并不需要指定它的长度。ArrayList继承了IList接口,所以它可以很方便的进行数据的添加。
以无参数构造方法创建 ArrayList 时,实际上初始化赋值的是一个空数组。当真正对数组进行添加元素操作时,才真正分配容量。即向数组中添加第一个元素时,数组容量扩为10。
扩容机制
-
add()方法
public boolean add(E e) { ensureCapacityInternal(size + 1); elementData[size++] = e; return true; }
-
ensureCapacityInternal()方法
private void ensureCapacityInternal(int minCapacity) { if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {//获取默认的容量和传入的参数的较大值 //当add第一个元素时,minCapacity为1,执行Math.max()之后取最大值10; minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); } ensureExplicitCapacity(minCapacity); }
-
ensureExplicitCapacity()方法
private void ensureExplicitCapacity(int minCapacity) { modCount++; // overflow-conscious code if (minCapacity - elementData.length > 0) grow(minCapacity); } //add第一个元素时,elemtntData.length为0,此时minCapacity为10,执行grow()方法。 //当第二次进入的时候,minCapacity为2,elementData.length为10所以不会执行grow()方法,直到添加到第11个元素,才执行扩容
-
grow()方法。
private void grow(int minCapacity) { //扩容数组,oldCapacity为旧容量,newCapacity为新容量 int oldCapacity = elementData.length; //将oldCapacity 右移一位相当于oldCapacity /2,newCapacity的值为旧的1.5倍 int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) //newCapacity大于最大容量,则执行hugeCapacity()比较minCapacity与MAX_ARRAY_SIZE newCapacity = hugeCapacity(minCapacity); // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); }