java - 为什么 ArrayList 通过特定公式扩展 elementData 数组?

标签 java arrays collections arraylist

就在五分钟前,我发现了 ArrayList 的工作原理。它有 elementData 字段,它是具有特定类型的数组,如果我们添加元素并且 elementData 数组已满,集合内部通过以下公式创建另一个数组:

(oldCapacity * 3) / 2 + 1

并将数据从旧数组复制到新数组。我只是想知道,这是为什么?为什么不把最后一码加倍呢?我在哪里可以通过描述此公式获得有关 ArrayList 集合的内部表示的更多理论信息。 附言对不起我的英语,它不是我的母语。

最佳答案

实际上,增长政策是未指定的,除了它guarantees添加元素具有恒定的摊余成本。

您提出的方案和您的 JDK 使用的方案都提供了这样的保证。事实上,任何乘法增长方案都是合规的。其他语言/库将大小增加两倍,因此这也是一种常见的方案。不同的 Java 实现可以选择遵循该方案,并且仍然符合规范。

参见 Amortized analysis of std::vector insertion 中的讨论-- 它是关于 C++ 的,但同样适用于 Java。

关于java - 为什么 ArrayList 通过特定公式扩展 elementData 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14147928/

相关文章:

arrays - 如何在 Swift 中将字符串数组转换为字符串

collections - 如何使用 Magento 中的集合获取产品类别信息

java - java构造函数可以将接口(interface)作为参数吗

jquery - 使用 jQuery 从 HTML 元素名称获取键

java - 通用数组在直接引用时抛出 ClassCastException(在通过辅助方法调用时不会抛出)

java - 如何在 Java 中迭代 List<Map<String,Object>>

java - Java 中集合的泛型和通配符

java - Struts2:如何在jsp中显示一个Hashmap<Integer, Object>?

java - 使用 spring mvc 将 url 模式重定向到特定 Controller

java - 在 Java 应用程序中访问 SMSESSION 值