交换或创建新的引用?

时间:2014-07-16 20:53:18

标签: java garbage-collection

下面是一个简单的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;
                }

1 个答案:

答案 0 :(得分:2)

在我看来,答案取决于应用程序的上下文。问题中没有足够的背景可以给你100%的回答。

在您的示例中,创建新队列比交换队列更具可读性和可维护性。对于刚接触代码的人(或者如果您几个月后再查看它),您可以更轻松地阅读,从头开始使用新队列,而不必考虑您的情况。 ;使用Queue temp swap-a-roo。如果您对垃圾收集,内存泄漏等有信心,并且性能(内存或速度)不是问题,那么我会创建一个新队列。

另一方面,如果性能有问题,那么您可以使用交换。这对于内存有限和/或内存碎片可能影响速度的实时性能要求非常高的平台尤为重要。例如,在传统的游戏开发中,内存使用非常宝贵,因此看到对象的巧妙重用而不是对象的创建/销毁是很常见的。例如,游戏实体通常从预先分配的池中初始化。或者可以使用环形缓冲区而不是动态创建/销毁新缓冲区。在您的示例中,您可以预先分配特定大小的队列(即预先建立稳定的内存占用),然后在遍历中对它们进行操作。

希望有所帮助!