ArrayList中EMPTY_ELEMENTDATA和DEFAULTCAPACITY_EMPTY_ELEMENTDATA的区别

Posted zgqblogs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)

这就是目前我能看出来的唯一区别。

以上是关于ArrayList中EMPTY_ELEMENTDATA和DEFAULTCAPACITY_EMPTY_ELEMENTDATA的区别的主要内容,如果未能解决你的问题,请参考以下文章

如何从 ArrayList (Java) 中存储另一个数组的 ArrayList 获取数据?

为啥在一个 ArrayList 中改变一个对象会在所有其他 ArrayList 中改变它?

从 ArrayList 的 ArrayList 中删除重复项 [重复]

如何从arraylist中获取其中的一个元素

Java ArrayList:从包含 HashMap 的 ArrayList 中获取不同的值

获取Java中arrayList中重复值的计数而不影响arrayList的顺序[重复]