在Java 8中,为什么ArrayList的默认容量现在为零?

kevinarpe:

我记得在Java 8之前,默认容量ArrayList是10。

令人惊讶的是,对默认(无效)构造函数的评论仍然是: Constructs an empty list with an initial capacity of ten.

来自ArrayList.java

/**
 * 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 = {};

...

/**
 * Constructs an empty list with an initial capacity of ten.
 */
public ArrayList() {
    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
卢克·埃德(Luke Eder):

从技术上讲,10如果您允许对备用数组进行延迟初始化,则它为,而不是零。看到:

public boolean add(E e) {
    ensureCapacityInternal(size + 1);
    elementData[size++] = e;
    return true;
}

private void ensureCapacityInternal(int minCapacity) {
    if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
        minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
    }

    ensureExplicitCapacity(minCapacity);
}

哪里

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

您所指的只是在所有最初为空的ArrayList对象之间共享的大小为零的初始数组对象。懒惰地10保证的容量,Java 7中也存在这种优化。

诚然,建设者合同并不完全准确。也许这是造成混乱的根源。

背景

这是Mike Duigou的电子邮件

我已经发布了空ArrayList和HashMap补丁的更新版本。

http://cr.openjdk.java.net/~mduigou/JDK-7143928/1/webrev/

修订后的实现对这两个类都没有引入新的字段对于ArrayList,仅当以默认大小创建列表时,才会对后备数组进行延迟分配。根据我们的性能分析团队的说法,大约有85%的ArrayList实例是在默认大小下创建的,因此此优化将在绝大多数情况下有效。

对于HashMap,创意使用阈值字段来跟踪请求的初始大小,直到需要存储桶数组为止。在读取方面,使用isEmpty()测试空映射案例。在写入大小上,比较(table == EMPTY_TABLE)用于检测是否需要对存储桶数组进行充气。在readObject中,还有更多工作来尝试选择有效的初始容量。

来自:http : //mail.openjdk.java.net/pipermail/core-libs-dev/2013-April/015585.html

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在Java 8中Cloneable中没有默认的clone()

为什么在Java8中使用“默认”关键字

为什么JCF接口中的许多方法未在Java 8中设为默认方法?

为什么 java 8 中 MaxMetaSpaceSize 的默认值为 18446744073709486080?

Java 中 ArrayList 的最大容量是多少?

如何在Java中获得ArrayList的容量?

为什么在OSX上复制和粘贴图像现在在Java 8中返回sun.awt.image.MultiResolutionImage

Java8:为什么禁止为java.lang.Object中的方法定义默认方法

Java 8中的歧义方法,为什么?

Java:为什么带有元素的ArrayList的打印输出为零?

为什么我们需要Java中的默认方法?

删除在Java中ArrayList中从尾随零

为什么LinkedList和arraylist在Java中扩展AbstractList?

为什么ArrayList中的排序方法比阵列在Java快?

为什么我在java中的arraylist自己变空了

为什么java.util.Arraylist#clear是在OpenJDK中实现的?

使用contains()在Java ArrayList中检查零

为什么java.net.SocksSocketImpl是Java中默认的java.net.Socket实现?

为什么ArrayList 10的默认容量是多少?

为什么使用循环来实现在java.util.Arrays中的的binarySearch()方法?

为什么会出现在导入处理核到Java中的错误?

为什么会出现在Java中没有实例级Stream.concat方法?

为什么会出现在Java中的HashMap重复键?

为什么Java 8中没有BooleanConsumer?

为什么在Java 8中按顺序收集并行流

为什么在Java 8中编译此通用代码?

为什么Java8不在yum中?

为什么在参数中不使用Java 8的Optional

为什么Java 8中没有原始BiConsumer?