【问题标题】:memory usage of ArrayList<Integer>ArrayList<Integer> 的内存使用情况
【发布时间】:2012-09-27 15:12:07
【问题描述】:

我在我的研究项目中使用ArrayList&lt;Integer&gt;。我需要在此列表中保留未知数量的整数。有时我需要更新列表:删除现有记录或添加新记录。因为Integer 是一个对象,所以它比int 占用更多的内存。是否有任何替代方法来维护比Integer 消耗更少内存的列表?

【问题讨论】:

  • 根据实现的不同,Integer 可能只需要 16 个字节,而 int 则需要 4 个字节。真的有那么大吗?

标签: java memory-management arraylist integer


【解决方案1】:

您还应该考虑为您提供替代存储系统ArrayList。至于链接机制,每个元素都有一个开销(有时)消耗更多的内存作为值本身。也许您不需要订购它们。您是否考虑过Map 或简单的Set(如果适用)或实现您自己的数据结构?

【讨论】:

    【解决方案2】:

    这取决于您使用的语言,但我假设它是 Java。在 Java 中,您可能知道,不能在 ArrayList 中使用整数,因为它们是原始数据类型。要使用整数,您必须使用固定大小的常规数组。这意味着每次添加内容时都需要创建一个更大的新数组,假设元素数量大于数组。你用内存来换取复杂性,因为你必须编写更多的代码,并且来回移动整数。

    减少的内存使用不太可能值得付出努力,并且在实施此类解决方案时存在额外的错误风险。

    【讨论】:

    • (1) 数组不是“不可变的”,它们是“固定大小的”。 (“不可变”意味着您甚至无法更改它们的元素。) (2) 您不需要在每次添加某些内容时创建更大尺寸的数组;您只需要跟踪列表的大小,它可以小于数组的大小。 (事实上​​,这就是 JDK ArrayList 类的工作方式,只是它使用 Object[] 而不是 int[]。)
    【解决方案3】:

    尝试一种针对内存使用优化的整数列表实现,例如Colt library 中的那个:

    http://acs.lbl.gov/software/colt/api/cern/colt/list/IntArrayList.html

    Java Integer objects usually require more overhead than an int primitive,因此您需要一个空间优化的实现。

    来自Colt:

    科学和技术计算(例如在 CERN 进行的)的特点是对问题规模的要求很高,并且需要在相当小的内存占用情况下获得高性能。 [...]

    【讨论】:

      【解决方案4】:

      您可以使用带有 int-s 的数组并使用与 ArrayList 相同的逻辑编写自己的方法。但 IMO 是个坏主意 - 现代机器有足够的内存来使用 Integer 对象,相信我...... :)

      【讨论】:

      • 是的,数组是保留原始类型的唯一方法
      • 抱歉,这话很愚蠢。我的电脑内存在一秒钟内被填满。当您存储数百万个整数时,500% 的开销(或实际开销)是不可接受的。
      猜你喜欢
      • 1970-01-01
      • 2015-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多