2015-11-13 30 views
10

JDK doc对于ArrayList constructor表示初始容量为10.JDK API文档对ArrayList构造函数不正确。这是一个错误?

这实际上是错误的,因为初始容量为0,直到将某项内容添加到列表中。我检查了Open JDK的源代码以及JDK附带的src.zip。

据我所知,这是一个性能优化,但这会被视为一个错误?

+0

+1你找到了Java文档上的错误。正如我的回答中所解释的那样,新代码在java 7中是有效的,但文档尚未更新。 –

+0

取决于你画线的地方。你也可以争辩说这是一个懒惰的类初始化。请注意,* no *数组在默认构造函数中分配。 – aioobe

+0

我向Oracle提出了一个新的错误。当bug ID将可用时,我会发布它。 –

回答

7

仅对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审查文档。

+1

看看源代码。构造函数'ArrayList()'包含这行:'this.elementData = EMPTY_ELEMENTDATA;','EMPTY_ELEMENTDATA'定义在这里:'private static final Object [] EMPTY_ELEMENTDATA = {};'。空数组的大小不是10,而是0,因为OP表示 – Paul

+0

我添加了ArrayList()和ArrayList(int initialCapacity)的源代码 –

+2

这是什么版本?在1.8中,构造函数按照我在第一条评论中提到的方式进行编码。 – Paul

1

这是文档中的错误。他们忘了更新评论。

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

'EMPTY_ELEMENTDATA'是大小为0的'Object []'。初始容量为0,而不是10。 – Paul

+0

它发生在JDK 7的一个小更新中的某处。我正在使用JDK 7更新75并且10不是当下。 –

+0

@AseemBansal - 我只看到jdk7和jdk8之间的差异。 – TheLostMind

0

从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; 
} 
/* 
相关问题