ArrayList中EMPTY_ELEMENTDATA和DEFAULTCAPACITY_EMPTY_ELEMENTDATA的区别
先看声明
private static final Object[] EMPTY_ELEMENTDATA = {};
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
除了名字完全一样,还都被static final修饰了
那为什么需要两个一样的呢?
其实要看在刚刚创建的一个ArrayList中添加元素会发生什么
这里有两种创建方式:
ArrayList list1= new ArrayList(0);
ArrayList list2= new ArrayList();
第一种构造函数是这么写的:
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);
}
}
当initialCapacity
为0时,elementData
被赋值为EMPTY_ELEMENTDATA
第二种构造函数是这么写的:
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
elementData
直接被赋值为DEFAULTCAPACITY_EMPTY_ELEMENTDATA
接下来,我们来看添加元素的操作
list1.add(1);
数组是空的,肯定不够
于是便要扩容,在扩容之前,有一个确定增长后的数组大小的函数
之前的源码不贴了,无论哪种方法,来这里minCapacity都是1
private static int calculateCapacity(Object[] elementData, int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
return Math.max(DEFAULT_CAPACITY, minCapacity);
}
return minCapacity;
}
鉴于我们只添加了一个元素,可以得出
如果使用第一个构造函数,添加一个元素后,elementData.length=1
如果使用第二个构造函数,添加一个元素后,elementData.length=10 (DEFAULT_CAPACITY就是10)
这就是目前我能看出来的唯一区别。
如需转载,请注明出处
如有侵权,联系删除
2290713181@qq.com
如有侵权,联系删除
2290713181@qq.com