哪个对象需要更多内存,null或空列表?

时间:2018-03-05 17:54:37

标签: java

我试图弄清楚这两个对象中哪一个需要更多内存。

现在通过检查此引用,我看到空成本为4到8个字节Java - Does null variable require space in memory

但不知道有一个空的String ArrayList会花多少钱。谈论记忆的成本是否相同?

有什么想法吗?

4 个答案:

答案 0 :(得分:5)

如果按空列表,则表示:

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

然后,这将比使用null占用更多空间。

但是如果你打算使用:

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

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

答案 1 :(得分:1)

你应该使用

Collections.emptyList()

在内部,这指向public static final List EMPTY_LIST = new EmptyList<>();所以不会吃任何额外的记忆。它与自己创建一个空列表具有相同的效果,但没有开销。

答案 2 :(得分:1)

显式构建新的空列表将使用更多内存。 List的大多数(如果不是全部)实现都会产生一些簿记和开销(大小,头部,尾部等)。例如。 LinkedList有一个尾部和一个头部,在实例化时会耗尽更多的内存。

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

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

要回答有关ArrayList的初始问题,该实现只有一个额外的字段,而不是存储的元素size。因此,虽然它不会像null那样使用尽可能少的空间,但开销微乎其微。

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

答案 3 :(得分:0)

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

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