我试图弄清楚这两个对象中哪一个需要更多内存。
现在通过检查此引用,我看到空成本为4到8个字节Java - Does null variable require space in memory
但不知道有一个空的String ArrayList会花多少钱。谈论记忆的成本是否相同?
有什么想法吗?
答案 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
本身不占用任何空间。