就在五分钟前,我发现了 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/