我有一个Node
s的二叉树,想要遍历它。我看到的最常见方法是Stack
或LinkedList
。我还看到其他方法没有将每个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
中存储的对象?
答案 0 :(得分:2)
您只能在使用new
关键字时创建新对象(一般来说)。由于new
中没有objTracker.add(objs[i]);
,因此不会创建新对象。
答案 1 :(得分:1)
在Java中,堆栈内存与堆内存是分开的。堆栈内存被用于每个方法调用,但通常这不算作“占用”内存,因为它不是由GC管理的,因为它会在调用返回后立即释放。
最后,您必须将对象存储在某处。所以它是堆栈或堆。如果您没有分配大小,列表和数组具有可比较的空间要求。在您的代码中,您没有分配任何节点 - 它们已经存在。您只为数组/列表分配空间。
您使用代码执行的操作很可能是多余的。您可以首先将您的元素添加到List。如您所知,首先将对象存储在数组中,然后将它们复制到List。如果您没有进一步使用objs
,则objs
最终会被垃圾回收,只留下objTracker
内存。