Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 递归创建新对象是否比创建引用慢?_Java_Recursion_Instantiation - Fatal编程技术网

Java 递归创建新对象是否比创建引用慢?

Java 递归创建新对象是否比创建引用慢?,java,recursion,instantiation,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); r

假设我有以下代码:

    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;
publicstaticarraylistdosomething(intn){
ArrayList=新建ArrayList();

如果(nYes),则第一个代码的速度较慢。对于
n
的每一个值大于0,则第一个部分的速度等于:

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

这仅在实际需要时使用
list
变量。甚至为
n声明它也是毫无意义的。是的,第一个代码的速度较慢。对于
n
的每一个值大于0,您最终得到的第一个部分相当于:

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

这只会在实际需要时使用
列表
变量。甚至为
n声明它都是毫无意义的,在这段代码中递归在哪里?抱歉-没有发布所有代码来节省空间。应该意识到没有它就没有意义!在return语句中对局部变量赋值是毫无意义的。(好吧,在有些情况下,finally块中可能很重要,但在这里毫无意义。)@JonSkeet:你会推荐什么替代方法?在方法之外声明一个静态列表?(我本来会这样做,但不允许!!)创建一个对象比不创建一个对象要慢。递归在这段代码中的位置在哪里?抱歉-没有发布所有代码以节省空间。应该意识到没有它是没有意义的!在return语句中使用对局部变量的赋值是没有意义的。(好吧,在有些情况下,finally块中可能很重要,但在这里毫无意义。)@JonSkeet:你会推荐什么替代方法?在方法之外声明一个静态列表?(我本来会这样做,但不允许!!)创建一个对象比不创建一个对象要慢。因此,在方法外部静态创建ArrayList会更好,这样在需要时才需要对它进行操作,还是在方法内部进行操作会更好,将它设置为null,并仅在递归到达其结束语句时实例化它?@AndrewMartin:不,没有您需要尽早使用
列表
变量。有关更好的代码,请参阅我的编辑。或者,您可以在调用外部创建列表,并将其作为参数传递到方法中,将其更改为
void
方法。当然,我会更改此代码以避免成为递归方法-我假设您的实际情况是更复杂一点。那么,在方法外部静态创建ArrayList是否更好,这样在需要时才需要对它进行操作,还是在方法内部进行操作更好,将其设置为null,并仅在递归到达其结束语句时对其进行实例化?@AndrewMartin:不,不需要
列表
变量您可以尽早使用它。请参阅我的编辑以获得更好的代码。或者,您可以在调用之外创建列表,并将其作为参数传递到方法中,将其更改为
void
方法。当然,我会更改此代码以避免成为递归方法-我假设您的实际情况稍微复杂一些。
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;
}