不懂ArrayList源码中这两个变量的区别

Scaarf 2017-11-14 07:37:59
最近在看集合框架源码,发现ArraList中定义了这两个变量:

/**
* 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 = {};

不是很理解上面给的注释。。。。。一个是空的实例,一个是空的默认不包含任何元素的实例?怎么感觉一样啊。。。。。
...全文
422 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Scaarf 2017-11-23
  • 打赏
  • 举报
回复
引用 2 楼 groovy2007 的回复:
研究了一下源代码。旧版的java(jdk6)里的默认构造函数是这样的

/**
 * 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 纯粹就是为了延迟初始化。 如果只有一个空数组,就没法表示语义上的细微差别。 其实从用户的角度看,是不在乎这些区别的。
动力,非常感谢
墨笙弘一 2017-11-21
  • 打赏
  • 举报
回复
下面那个注释不是写了 当第一次加入元素的时候会有所区别吗
Clumsy__Cat 2017-11-21
  • 打赏
  • 举报
回复
也就是多了个延迟初始化是吧,也就是稍微提高了下性能,多了一点优化
groovy2007 2017-11-20
  • 打赏
  • 举报
回复
研究了一下源代码。旧版的java(jdk6)里的默认构造函数是这样的

/**
 * 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 纯粹就是为了延迟初始化。 如果只有一个空数组,就没法表示语义上的细微差别。 其实从用户的角度看,是不在乎这些区别的。
小燃儿 2017-11-15
  • 打赏
  • 举报
回复
讲的很清楚下面那个当添加元素的时候就会知道数组的大小 就是默认的容量。 然后你看下 这两个构造函数应该不难理解吧

  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;
    }

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧