JDK doc对于ArrayList constructor表示初始容量为10.JDK API文档对ArrayList构造函数不正确。这是一个错误?
这实际上是错误的,因为初始容量为0,直到将某项内容添加到列表中。我检查了Open JDK的源代码以及JDK附带的src.zip。
据我所知,这是一个性能优化,但这会被视为一个错误?
JDK doc对于ArrayList constructor表示初始容量为10.JDK API文档对ArrayList构造函数不正确。这是一个错误?
这实际上是错误的,因为初始容量为0,直到将某项内容添加到列表中。我检查了Open JDK的源代码以及JDK附带的src.zip。
据我所知,这是一个性能优化,但这会被视为一个错误?
仅对JDK有效多达6
它不是一个错误。
用于存储列表的元素内部数组的初始容量是真的10.
这不意味着该列表的大小是10.只有所创建大小10的空数组。
当一个对象被添加到列表中时,一个指向最后一个元素的内部指针被移动一个。如果数组的容量不足,则会创建另一个具有较高容量的数组,并将旧数组复制到新数组的第一部分。在这一刻阵列的容量不10.
的代码是:
public ArrayList() {
this(10); // Here the 10 of the default capacity
}
public ArrayList(int initialCapacity) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];
}
对于较新的JDK(从Java 1.7)
重要注:是的,在更新版本的ArrayList
(我认为来自Java7)源代码已更改。 该文档仍然是旧版本。所以是的这是文档上的一个错误!
这里构造
private static final Object[] EMPTY_ELEMENTDATA = {};
....
public ArrayList() {
super();
this.elementData = EMPTY_ELEMENTDATA; // This is 0 capacity!!!!
}
注意的新版本:我开了一个新的bug到Oracle审查文档。
这是文档中的错误。他们忘了更新评论。
JDK 7:
public ArrayList() {
this(10);
}
JDK 8:
/**
* Constructs an empty list with an initial capacity of ten.
*/
public ArrayList() {
super();
this.elementData = EMPTY_ELEMENTDATA;
}
'EMPTY_ELEMENTDATA'是大小为0的'Object []'。初始容量为0,而不是10。 – Paul
它发生在JDK 7的一个小更新中的某处。我正在使用JDK 7更新75并且10不是当下。 –
@AseemBansal - 我只看到jdk7和jdk8之间的差异。 – TheLostMind
从1.7他们说,缺省尺寸10的ArrayList会增加第一元件到它之后创建..它意味着ArrayList对象不会被创建,直到我们添加一个元素为止,阅读'elementData'变量给出的描述(任何空的ArrayList与elementData == EMPTY_ELEMENTDATA将被展开DEFAULT_CAPACITY {它是一个int变量}当第一个元素被添加)。它像懒惰的实例。
In 1。6即使我们不添加元素ArrayList中它正在创建10大小的空对象数组,它像渴望实例..
/**
* Default initial capacity.
*/
private static final int DEFAULT_CAPACITY = 10;
/**
* Shared empty array instance used for empty instances.
*/
private static final Object[] EMPTY_ELEMENTDATA = {};
/*
* The array buffer into which the elements of the ArrayList are stored.
* The capacity of the ArrayList is the length of this array buffer. Any
* empty ArrayList with elementData == EMPTY_ELEMENTDATA will be expanded
* DEFAULT_CAPACITY when the first element is added.
*/
private transient Object[] elementData;
/**
* Constructs an empty list with an initial capacity of ten. (they might have forgot to update this..)
*/
public ArrayList() {
super();
this.elementData = EMPTY_ELEMENTDATA;
}
/*
+1你找到了Java文档上的错误。正如我的回答中所解释的那样,新代码在java 7中是有效的,但文档尚未更新。 –
取决于你画线的地方。你也可以争辩说这是一个懒惰的类初始化。请注意,* no *数组在默认构造函数中分配。 – aioobe
我向Oracle提出了一个新的错误。当bug ID将可用时,我会发布它。 –