以递归方式创建新对象比创建引用慢吗?

时间:2013-02-17 20:05:33

标签: java recursion instantiation

说我有以下代码:

    public static ArrayList<Integer> doSomething(int n) {

    ArrayList<Integer> list = new ArrayList<Integer>();
    if (n <= 0)
        return list ;
    list = ListMethods.doSomething(n - 1);
    list.add(n);

    return list;

这比这段代码慢吗?

    public static ArrayList<Integer> doSomething(int n) {

    ArrayList<Integer> list = null;
    if (n <= 0)
        return list = new ArrayList<Integer>();
    list = ListMethods.doSomething(n - 1);
    list.add(n);

    return list;

我问,因为我的一位讲师在他的笔记中使用了后面的代码,而我看到其他在线指南使用前者。这只是个人偏好,还是存在速度差异?另外,如果存在速度差异,是否太小而无法关注?

1 个答案:

答案 0 :(得分:4)

是的,第一个代码速度较慢。对于 n的每个值大于0,您最终得到的第一部分相当于:

ArrayList<Integer> list = new ArrayList<Integer>();
list = ListMethods.doSomething(n - 1);

创建新的ArrayList对象并立即为同一个变量分配不同的值是没有意义的。

第二个代码更好,但在可读性方面仍然可以得到显着改善:

public static ArrayList<Integer> doSomething(int n) {
    if (n <= 0) {
        return new ArrayList<Integer>();
    }
    ArrayList<Integer> list = doSomething(n - 1);
    list.add(n);
    return list;
}

如果实际需要,则仅使用list变量。即使为n <= 0案例声明它也是毫无意义的,你只是将返回一个新的ArrayList<Integer>