不懂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 = {};

不是很理解上面给的注释。。。。。一个是空的实例,一个是空的默认不包含任何元素的实例?怎么感觉一样啊。。。。。
...全文
434 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;
    }

考虑可再生能源出力不确定性的商业园区用户需求响应策略(Matlab代码实现)内容概要:本文围绕“考虑可再生能源出力不确定性的商业园区用户需求响应策略”展开,结合Matlab代码实现,研究在可再生能源(如风电、光伏)出力具有不确定性的背景下,商业园区如何制定有效的需求响应策略以优化能源调度和提升系统经济性。文可能涉及不确定性建模(如场景生成与缩减)、优化模型构建(如随机规划、鲁棒优化)以及需求响应机制设计(如价格型、激励型),并通过Matlab仿真验证所提策略的有效性。此外,文档还列举了大量相关的电力系统、综合能源系统优化调度案例与代码资源,涵盖微电网调度、储能配置、负荷预测等多个方向,形成一个完整的科研支持体系。; 适合人群:具备一定电力系统、优化理论和Matlab编程基础的研究生、科研人员及从事能源系统规划与运行的工程技术人员。; 使用场景及目标:①学习如何建模可再生能源的不确定性并应用于需求响应优化;②掌握使用Matlab进行商业园区能源系统仿真与优化调度的方法;③复现论文结果或开展相关课题研究,提升科研效率与创新能力。; 阅读建议:建议结合文提供的Matlab代码实例,逐步理解模型构建与求解过程,重点关注不确定性处理方法与需求响应机制的设计逻辑,同时可参考文档列出的其他资源进行扩展学习与交叉验证。
【多微电网】含多微电网租赁共享储能的配电网博弈优化调度(Matlab代码实现)内容概要:本文介绍了基于Matlab代码实现的含多微电网租赁共享储能的配电网博弈优化调度方法,旨在通过共享储能资源提升多微电网系统的运行效率与经济性。文结合博弈论思想,构建了多主体间的优化调度模型,考虑各微电网在储能租赁机制下的竞争与协作关系,实现了配电网能量的合理分配与成本优化。该资源不仅提供了完整的Matlab代码实现,还涵盖了模型构建、算法设计及仿真分析全过程,适用于电力系统优化领域的科研与工程实践。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事微电网、储能优化等相关领域的工程技术人员。; 使用场景及目标:①研究多微电网系统共享储能的租赁机制与调度策略;②应用博弈论方法解决多主体能源优化问题;③通过Matlab仿真验证优化模型的有效性,提升配电网运行的经济性与稳定性。; 阅读建议:建议读者结合代码与理论模型同步学习,重点关注博弈模型的构建逻辑与Matlab实现细节,可进一步扩展至不同场景(如考虑可再生能源不确定性、需求响应等)进行二次开发与实验验证。

62,628

社区成员

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

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