【问题标题】:Why Java grows ArrayList by 3/2?为什么 Java 将 ArrayList 增长 3/2?
【发布时间】:2014-02-07 09:56:45
【问题描述】:

为什么 Java 将完整数组增长 3/2 而不是 2?

“a的选择取决于库或应用程序:一些教科书 使用 a = 2,但 Java 的 ArrayList 实现使用 a = 3/2 和 C Python 的列表数据结构的实现使用了 a = 9/8。”

来源wikipedia

【问题讨论】:

  • 它是研究成果。因此,如果您想让您的继承 AbstractList 并覆盖相应的您的要求。
  • 因为随意将大小加倍会比增加 1.5 或 1.1 更快地消耗内存。您需要在调整大小的频率和大小之间进行权衡。可能 1.5 是一个不错的选择。
  • @StefanoSanfilippo 此外,与 1.1 相比,他们可以通过加法和右移快速计算 1.5

标签: java arraylist


【解决方案1】:

一般来说,增长因子的选择主要取决于经验和有根据的猜测。您必须在不必要的内存使用(对于未使用的数组空间)和不必要的运行时使用(如果必须经常扩大数组)之间找到适当的平衡。您还必须在不知道列表有多大的情况下执行此操作。在 Java 中它是 3/2 的原因仅仅是因为有人认为它是最好的。

【讨论】:

  • 有资格在Java中,“某人”意味着“顶级专家委员会”:)
  • @MarkoTopolnik 确实:D
【解决方案2】:

我已经记录了一些关于增长因子的理论结果,可以帮助您在此处为自己的数据结构选择增长因子:Magic Factors#Grow Factor。当集合的大小事先未知时,较高的增长因子会导致更高的内存占用和更低的平均“构建期间每个元素的重新插入”指标。

我同意 André Stannek 的观点,即 1.5 增长因子没有任何特殊属性,只是某人的“最终决定”。

【讨论】:

    猜你喜欢
    • 2011-06-29
    • 2010-12-30
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 2010-10-02
    • 2019-11-15
    相关资源
    最近更新 更多