下面是一个简单的bfs代码
private void bfsTraveral() {
if (root == null) {
throw new NullPointerException("The root cannot be null.");
}
Queue<TreeNode> queue = new LinkedList<>();
Queue<TreeNode> queueNext = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
System.out.println(node.element);
if (node.left != null) queueNext.add(node.left);
if (node.right != null) queueNext.add(node.right);
if (queue.isEmpty()) {
queue = queueNext;
queueNext = new LinkedList<>();
}
}
}
我的问题是关于队列为空时处理的代码段。
它会创建一个新的队列queueNext = new LinkedList<>();
。
我的问题是 - 交换而不是创建新对象是一种好习惯吗?如果是,为什么?注意,在上面的代码中,GC应该处理空引用,我们不会泄漏内存。
替换码:
if (queue.isEmpty()) {
Queue temp = queue;
queue = queueNext;
queueNext = temp;
}
答案 0 :(得分:2)
在我看来,答案取决于应用程序的上下文。问题中没有足够的背景可以给你100%的回答。
在您的示例中,创建新队列比交换队列更具可读性和可维护性。对于刚接触代码的人(或者如果您几个月后再查看它),您可以更轻松地阅读,从头开始使用新队列,而不必考虑您的情况。 ;使用Queue temp swap-a-roo。如果您对垃圾收集,内存泄漏等有信心,并且性能(内存或速度)不是问题,那么我会创建一个新队列。
另一方面,如果性能有问题,那么您可以使用交换。这对于内存有限和/或内存碎片可能影响速度的实时性能要求非常高的平台尤为重要。例如,在传统的游戏开发中,内存使用非常宝贵,因此看到对象的巧妙重用而不是对象的创建/销毁是很常见的。例如,游戏实体通常从预先分配的池中初始化。或者可以使用环形缓冲区而不是动态创建/销毁新缓冲区。在您的示例中,您可以预先分配特定大小的队列(即预先建立稳定的内存占用),然后在遍历中对它们进行操作。
希望有所帮助!