62,614
社区成员
发帖
与我相关
我的任务
分享
/**
* Shared empty array instance used for empty instances.
*/
private static final Object[] EMPTY_ELEMENTDATA = {};
/**
* Shared empty array instance used for default sized empty instances. We
* distinguish this from EMPTY_ELEMENTDATA to know how much to inflate when
* first element is added.
*/
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
/**
* Constructs an empty list with an initial capacity of ten.
*/
public ArrayList() {
this(10);
}
新版接口没变,但是实现变了,默认构造改成了延迟初始化,会在第一次添加元素的时候将大小变成10。
之所以有两个空的数组,我猜可能是为了严格保证与旧版的兼容性。也就是承诺函数文档给出的注释:
/**
* Constructs an empty list with the specified initial capacity.
*
* @param initialCapacity the initial capacity of the list
* @throws IllegalArgumentException if the specified initial capacity
* is negative
*/
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
/**
* Constructs an empty list with an initial capacity of ten.
*/
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
a = new ArrayList(0);//初始化为EMPTY_ELEMENTDATA; 与旧版相同
a.add(xx);//容量(capacity)变成了1, 与旧版相同
b = new ArrayList();//延迟初始化为10 (实际上为空,只是对外宣称为10。这一点是与旧版不同的)
b.add(xx);//容量变成了10,因为承诺的是10。此时的数组就与旧版完全相同了
DEFAULTCAPACITY_EMPTY_ELEMENTDATA 纯粹就是为了延迟初始化。
如果只有一个空数组,就没法表示语义上的细微差别。
其实从用户的角度看,是不在乎这些区别的。
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity]; // 存入array buffer
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA; // 空数组对象
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity); // 非法参数 抛出异常
}
}
/**
* Constructs an empty list with an initial capacity of ten.
* 无参构造 , 默认大小是 10
*/
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}