ArrayList参数在递归期间不会更新

时间:2016-10-15 00:32:09

标签: java recursion arraylist

我认为当ArrayList作为参数传递并在递归期间更新时,ArrayList会在所有递归堆栈帧中被修改。这是不正确的?

我试图传递一个空的ArrayList,然后用一个单词的排列填充它。我知道我不必将一个空的ArrayList作为参数传递,而是可以从这个方法返回一个ArrayList,但是我想知道我对在递归过程中如何存储和更新对象的理解是不正确的。

public static void findPermutations(String str, ArrayList<String> l, int from, int to, StringBuilder sb){

    if(from+1 == to){
      l.add(""+str.charAt(from));
      return;
    }

    if(from+2 == to){
      l.add(""+str.charAt(from)+str.charAt(from+1));
      l.add(""+str.charAt(from+1)+str.charAt(from));
      return;
    }

    char curr = str.charAt(from);
    findPermutations(str,l,from+1,to,sb);

    ArrayList<String> newList = new ArrayList<String>();

    for(String s: l){      
      for(int i=0; i<=s.length(); i++){
        sb.append(s.substring(0,i));
        sb.append(curr);
        sb.append(s.substring(i));
        newList.add(sb.toString());
        sb.setLength(0);
      }
    }

    //Making a copy of the arraylist
    //Shouldn't it update in the other recursion call stacks as well?

    l=new ArrayList<String>();
    for(String s:newList){
      l.add(s);
    }
  }

2 个答案:

答案 0 :(得分:0)

虽然列表是通过引用传递的,但l仅引用引用。执行l=new ArrayList<>()后,您只需更新l即可指向新实例。原始列表不受影响,递归堆栈中的l进一步向下仍然引用原始列表。

答案 1 :(得分:0)

//Making a copy of the arraylist
//Shouldn't it update in the other recursion call stacks as well?

l.clear(); // Do you really want to do this? 
           // It is analogous to the l = new ArrayList<>(), 
           // but it throws away the previous work.
l.addAll(newList);

该更改将更新在递归过程中包含对l的引用的所有变量。