当前位置: 首页 > 知识库问答 >
问题:

ArrayList公共构造函数-“构造一个初始容量为10的空列表”-在哪里?[副本]

衡子安
2023-03-14

请注意,它不是为什么要以初始容量启动 ArrayList 的副本?

查看java.util.ArrayList类的源代码,至少从java1.8开始,我看到以下代码:

/**
 * Constructs an empty list with an initial capacity of ten.
 */
public ArrayList() {
    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

在哪里

private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

尽管javadoc官方声明:

构造一个初始容量为10的空列表。

我概述:。。。初始容量为10。这十点在哪里?

我是否完全生气并错过了什么,或者这里只是一个javadoc错误?

UPD:它看起来像之前的java 1.8:

public ArrayList(int initialCapacity) {
    super();
    if (initialCapacity < 0)
        throw new IllegalArgumentException("Illegal Capacity: "+
                                           initialCapacity);
    this.elementData = new Object[initialCapacity];
}

/**
 * Constructs an empty list with an initial capacity of ten.
 */
public ArrayList() {
    this(10);
}

共有2个答案

叶鸿煊
2023-03-14

第一次向列表中添加元素时,容量将设置为10。

看这个:

/**
 * Default initial capacity.
 */
private static final int DEFAULT_CAPACITY = 10;

完整的程序

第1步:

public boolean add(E e) {
    modCount++;
    add(e, elementData, size);
    return true;
}

第2步:

private void add(E e, Object[] elementData, int s) {
    if (s == elementData.length)
        elementData = grow();
    elementData[s] = e;
    size = s + 1;
}

步骤3,列表< code >增长:

private Object[] grow() {
    return grow(size + 1); // size is 0 here
}

private Object[] grow(int minCapacity) {
    return elementData = Arrays.copyOf(elementData,
                                       newCapacity(minCapacity));  // newCapacity(1) will return 10, see step 4, the elementData will have capacity 10.
}

第4步,调用newSpace(1)

private int newCapacity(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    if (newCapacity - minCapacity <= 0) {
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
            return Math.max(DEFAULT_CAPACITY, minCapacity);   // will  return 10 here !!!!
        if (minCapacity < 0) // overflow
            throw new OutOfMemoryError();
        return minCapacity;
    }
    return (newCapacity - MAX_ARRAY_SIZE <= 0)
        ? newCapacity
        : hugeCapacity(minCapacity);
}
子车睿
2023-03-14

这是一种优化。开发人员决定用一个空的支持数组初始化<code>ArrayList</code>,只有当您开始向<code>List</code>添加元素时,才惰性地创建一个非空的支持阵列。

当您添加第一个元素(通过调用<code>add</code>)时,它会调用

ensureCapacityInternal(size + 1);

检查元素数据 == DEFAULTCAPACITY_EMPTY_ELEMENTDATA,如果是,则将容量设置为

minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);

DEFAULT_CAPACITY10

 类似资料:
  • 我的问题是关于OOP(C)中的构造函数。当我在一个类中将默认构造函数定义为private,并且在main中将该类的一个对象初始化为default时,就会出现默认构造函数不可访问的错误。这很好。但我也在Public部分中使用默认参数构造函数,当我再次在main中初始化对象时,就会出现对函数重载的不明确调用。所以我的问题是,如果不能从main访问私有构造函数,那么编译器应该调用公共部分中的构造函数,这

  • 主要内容:初始化 const 成员变量构造函数的一项重要功能是对成员变量进行初始化,为了达到这个目的,可以在构造函数的函数体中对成员变量一一赋值,还可以采用 初始化列表。 C++构造函数的初始化列表使得代码更加简洁,请看下面的例子: 运行结果: 小明的年龄是15,成绩是92.5 李华的年龄是16,成绩是96 如本例所示,定义构造函数时并没有在函数体中对成员变量一一赋值,其函数体为空(当然也可以有其他语句),而是在函数首部与函数体之间添

  • 问题内容: 我有两个班,第一个是我的主班,第二个是我的编辑框架班。 我的第二个类(UpdateGUI)在其构造函数中提供oldName,并对其进行编辑,当我单击时,它将newName发送给我的第一个类。 我的第二堂课: 我的问题是,为什么newName为null? 更新: UpdateGUIDialog类: 输出: 我需要打印而不是null。 问题答案: Java对象有点像真实对象。并顾名思义:它

  • FAQs in section [10]: [10.1] 构造函数做什么? [10.2] List x; 和 List x();有区别吗? [10.3] 如何才能够使一个构造函数直接地调用另一个构造函数? [10.4] Fred 类的默认构造函数总是 Fred::Fred()吗? [10.5] 当我建立一个 Fred 对象数组时,哪个构造函数将被调用? [10.6] 构造函数应该用“初始化列表”还

  • 问题内容: 如果未将ArrayList初始化为字段,则将项目添加到ArrayList时出现NullPointerException。谁能解释为什么? 当我将ArrayList初始化为字段时起作用: 当我将ArrayList声明为字段然后在Class构造函数中对其进行初始化时,它不起作用: 问题答案: 因为构造函数中的版本正在创建一个新变量,而该变量恰好与您的成员字段名称相同,而成员字段仍未设置。这

  • 问题内容: 我在一个Activity中有一个IntentService,当我尝试调用该服务时,它将引发此错误,我发现这很奇怪,因为如果我声明了空的构造函数。 错误: AndroidManifest.xml 活动: 问题答案: 你是一个内部阶级。如果要将其保留在内部,请将其更改为static: 您可能需要阅读不同类型的嵌套类。google的第一个链接:http : //docs.oracle.com

  • 所以我正在学习构造函数初始值设定项列表,我写了以下代码: 为此我使用了g编译器。它调用的是构造函数而不是复制构造函数。它应该调用复制构造函数,因为我正在创建一个对象来创建另一个对象?这里的问题是什么,标准对此怎么说?

  • 问题内容: 我有一堂课,在那堂课我有: 然后在我的构造函数中: 如果这样做,一切正常。默认数据值已初始化,但如果我改为这样做: 它说: 为什么? 在构造函数内部初始化数组的最佳方法是什么? 问题答案: 这已经将您的数组元素初始化为0。您无需在构造函数中再次重复该操作。 在您的构造函数中,它应该是: