【问题标题】:which object requires more memory, null or an empty list?哪个对象需要更多内存,null 还是空列表?
【发布时间】:2018-03-05 17:54:36
【问题描述】:

我正在尝试找出两个对象中的哪一个需要更多内存。

现在通过检查此引用,我发现 null 需要 4 到 8 个字节 Java - Does null variable require space in memory

但不知道拥有一个空的 String ArrayList 需要多少成本。谈论内存的成本是否相同?

有什么想法吗?

【问题讨论】:

  • 简单的方法:创造十亿个。
  • 可能。我的计算机有很多千兆字节(即数百万字节)。我已经有一段时间不关心这种优化水平了。
  • 少担心内存,多担心健壮性。您永远不应将 null 视为等同于空集合或数组。如果代码要指示空集合,请使用空集合。
  • 如果您对引用或对象占用的内存感兴趣,您应该具体说明。

标签: java


【解决方案1】:

如果用空列表表示:

List<Object> empty = new ArrayList<> ();

那么这将比使用null 占用更多空间。

但如果你打算使用:

List<Object> empty = Collections.emptyList(); // I'm a singleton

然后,因为您所有的空列表都将引用同一个对象,所以您最终将获得与使用 null 相同的内存消耗。

【讨论】:

    【解决方案2】:

    你应该使用

    Collections.emptyList()

    在内部,这指向public static final List EMPTY_LIST = new EmptyList&lt;&gt;();,因此不会占用任何额外的内存。它与自己创建一个空列表的效果相同,但没有开销。

    【讨论】:

      【解决方案3】:

      显式构造一个新的空列表会占用更多内存。 List 的大多数(如果不是全部)实现都有一些记账和开销(大小、头部、尾部等)。例如。 LinkedList 有一个尾巴和一个头,在实例化时会消耗更多的内存。

      最终 null 将仅使用 4-8 个字节,具体取决于您运行的是 32 位还是 64 位平台。

      正如其他答案中提到的,如果您只需要空列表,您应该使用Collections.emptyList(),但是如果您确实需要一个可变列表,您将无法使用它,因为您将返回的实例是不可变。

      为了回答关于ArrayList 的初始问题,实现除了存储元素size 之外只有一个额外字段。因此,虽然它不会像null 那样占用那么少的空间,但开销是微乎其微的。

      TLDR; null 将仅使用存储 32 位或 64 位指针所需的空间,列表实现的实际实例化将消耗更多内存,因为实现中保存了一些状态。

      【讨论】:

        【解决方案4】:

        reference 占用相同的内存(在 32 位系统上为 4 个字节,在 64 位系统上为 8 个字节)。

        object”在列表为空的情况下占用更多空间,因为null 本身不占用任何空间。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-11-15
          • 1970-01-01
          • 2022-01-02
          • 1970-01-01
          • 2018-09-15
          • 2012-05-21
          • 1970-01-01
          相关资源
          最近更新 更多