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;
}