指向数组的Java堆栈是否会使用相同数量的内存?

时间:2017-11-13 05:05:58

标签: java

我有一个Node s的二叉树,想要遍历它。我看到的最常见方法是StackLinkedList。我还看到其他方法没有将每个Node添加到堆栈/列表中,并且似乎几乎不占用内存(它们使用递归来代替探索每个元素)。

如果我让List<Node>跟踪树中的每个节点,我会占用2*n内存量吗?或者,因为对象已经存在于树中,所以List只是一堆指向Node对象的指针(存在于Tree中),因此不会占用两倍的内存吗?

测试用例:

Object objs[] = new Object[40];
/* 
    Initialize the 40 objects here 
*/
List<Object> objTracker = new List<>();
for(int i=0; i<objs.length; i++) {
    objTracker.add(objs[i]);
}

这现在占用内存量的2倍,还是只需将所有objTrackers重定向/指向objs中存储的对象?

2 个答案:

答案 0 :(得分:2)

您只能在使用new关键字时创建新对象(一般来说)。由于new中没有objTracker.add(objs[i]);,因此不会创建新对象。

答案 1 :(得分:1)

在Java中,堆栈内存与堆内存是分开的。堆栈内存被用于每个方法调用,但通常这不算作“占用”内存,因为它不是由GC管理的,因为它会在调用返回后立即释放。

最后,您必须将对象存储在某处。所以它是堆栈或堆。如果您没有分配大小,列表和数组具有可比较的空间要求。在您的代码中,您没有分配任何节点 - 它们已经存在。您只为数组/列表分配空间。

您使用代码执行的操作很可能是多余的。您可以首先将您的元素添加到List。如您所知,首先将对象存储在数组中,然后将它们复制到List。如果您没有进一步使用objs,则objs最终会被垃圾回收,只留下objTracker内存。