请注意,它不是为什么要以初始容量启动 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);
}
第一次向列表中添加元素时,容量将设置为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);
}
这是一种优化。开发人员决定用一个空的支持数组初始化<code>ArrayList</code>,只有当您开始向<code>List</code>添加元素时,才惰性地创建一个非空的支持阵列。
当您添加第一个元素(通过调用<code>add</code>)时,它会调用
ensureCapacityInternal(size + 1);
检查元素数据 == DEFAULTCAPACITY_EMPTY_ELEMENTDATA
,如果是,则将容量设置为
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
DEFAULT_CAPACITY
是 10
。
我的问题是关于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。您无需在构造函数中再次重复该操作。 在您的构造函数中,它应该是: