使用clone()vs new obj

时间:2014-01-30 19:56:27

标签: java clone

我正在寻找Cracking the Code Interview和这个问题。我应该在二叉树中找到具有给定数字之和的所有路径。我通常理解这段代码,但我想知道为什么答案使用clone()而不是使用new创建新对象?

public static void findSum(BinaryTreeNode root, int sum, ArrayList<Integer> buffer, int level) {
    // done parsing or empty tree
    if (root == null) {
        return;
    }
    int tmp = sum;
    buffer.add(root.value);
    for (int i = level; i >= 1; i--) {
        tmp -= buffer.get(i);
        if (tmp == 0) {
            print(buffer, i, level);
        }
    }
    ArrayList<Integer> c1 = (ArrayList<Integer>) buffer.clone();
    ArrayList<Integer> c2 = (ArrayList<Integer>) buffer.clone();
    findSum(root.left, sum, c1, level + 1);
    findSum(root.left, sum, c2, level + 1);
}

public static void print(ArrayList<Integer> bugger, int level, int i2) {
    for (int i = level; i <= i2; i++) {
        System.out.print(buffer.get(i) + " ");
    }
    System.out.println();
}

4 个答案:

答案 0 :(得分:2)

这是一个过早的微优化,归因于克隆速度更快(here is an answer with the details on why cloning is faster for array lists)。

看起来更干净的解决方案

ArrayList<Integer> c1 = new ArrayList<Integer>(buffer);

更容易理解,不需要演员,也不太可能导致任何可测量的性能差异。

答案 1 :(得分:1)

在这种情况下,没有理由更喜欢clone()new ArrayList<Integer>(buffer)也可以正常工作。

但是除了集合之外的其他类的情况可能并不相同。当没有构造函数复制对象时,通常会使用clone,但无论如何都需要重复。

答案 2 :(得分:1)

您可以创建一个新的ArrayList对象并获得相同的结果。一个好的编程实践(尽管不一定适用于这种情况)是使用原始对象的副本,而clone()通过Object类的隐式继承一直提供这一点。因此,他们使用克隆的一个可能原因是因为它是复制对象最常用的方法。当你考虑它时,它会更紧凑。

答案 3 :(得分:1)

new运算符实例化新对象,而clone()更像是复制构造函数。 clone()方法创建值为member attributes also copied的对象副本。