2019独角兽企业重金招聘Python工程师标准>>>
使用无参构造方法创建对象
package com.jettyw.arraylist;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author jettyw
* 2017-05-25
* 使用无参构造方法创建ArrayList对象
*/
public class ArrayListConstructorTest {
public static void main(String[] args) {
List list=new ArrayList();
}
}
从上一节我们知道使用无参构造时this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;数组初始化为一个长度为0的空数组。那么在我们第一次添加元素的时候,elementData的长度是如何实现扩展的。
我们调用ArrayList的添加元素的方法add(E e)
public boolean add(E e) {
//先确保数组的长度够用,否则进行扩展
//size=0
ensureCapacityInternal(size + 1);
//添加元素,将元素添加到数组中
elementData[size++] = e;
return true;
}
此时的size为0,调用ensureCapacityInternal(int minCapacity)方法这是一个私有方法。
private void ensureCapacityInternal(int minCapacity) {
//如果使用无参构造方法创建对象,第一次添加元素,数组最小的长度为默认长度10
//DEFAULT_CAPACITY为ArrayList声明的常量为10
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
//使用无参构造方法minCapacity=10
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
//如果不是第一次添加元素,不使用无参构造方法创建对象,走下一步确定一下是否要扩展数组
ensureExplicitCapacity(minCapacity);
}
调用ensureExplicitCapacity(minCapacity)方法进行最终的确认是否要扩展数组长度。
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
//如果最小长度比数组的长度大,则扩展数组长度,否则不扩展,直接添加元素
//使用无参构造方法第一次minCapacity=10 数组长度为0,需要扩展调用grow()
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
接着调用grow(minCapacity)进行元素的扩展。
private void grow(int minCapacity) {
//当前数组的长度
//使用无参构造方法第一次添加元素oldCapacity=0
int oldCapacity = elementData.length;
//将要将数组扩展到的长度,如果要扩展,数组的新长度总是原来长度的1.5倍
//使用无参构造方法第一次添加元素 newCapacity=0
int newCapacity = oldCapacity + (oldCapacity >> 1);
//如果新长度小于最小长度,说明目前数组的长度够用,不需要扩展
//使用无参构造方法newCapacity=10
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
//如果要扩展的长度比默认最大长度要打,则使用调用hugeCapacity()方法获取长度
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
//扩展数组之后进行数组的复制,将原来数组复制到扩展后的数组里面
//使用无参构造方法第一次添加元素扩展之后的数组长度为10
elementData = Arrays.copyOf(elementData, newCapacity);
}
不需要扩展的直接走elementData[size++] = e;否则扩展数组之后才走elementData[size++] = e;添加元素。在分析完源码之后我们可以得出结论,使用无参构造方法第一次添加元素产生一个长度为10的数组,在后续的添加过程中依然按照这个流程进行确定是否进行扩展数组长度。并且在扩展数组长度的时候再一次使用了Arrays.copyOf(elementData, newCapacity)方法进行数组的复制