class Solution {
public void backtrace(int i, String digits, StringBuilder sb, LinkedList<String> resList, boolean[] visited) {
if(sb.length() == digits.length()) {
resList.addLast(sb.toString());
//好玩:sb = new StringBuilder();
return;
}
char digit = digits.charAt(i);
String letters = letterMap[digit - '0'];
for (int j = 0; j < letters.length(); j++) {
sb.append(letters.charAt(j));
backtrace(i+1, digits, sb, resList, visited);
sb.deleteCharAt(sb.length()-1);
}
}
}
注:在为什么 new 一个 StringBuilder 与 不 new 都行?原因是方法在执行的时候有栈帧的概念,入栈的时候只是压栈方法参数是传入参数的副本。
应该注意到:Java 的数据类型有二:基本类型和引用类型
- 基本类型:值存放在局部变量表中,无论如何修改只会修改当前栈帧的值,方法执行结束对方法外不会做任何改变;此时需要改变外层的变量,必须返回主动赋值。
- 引用数据类型:指针存放在局部变量表中,调用方法的时候,副本引用压栈,赋值仅改变副本的引用。但是如果直接改变副本引用的值,修改了引用地址的对象,此时方法以外的引用此地址对象当然被修改。(两个引用,同一个地址,任何修改行为 2 个引用同时生效)
- 看一下面的例子:
public class Main{
public static void setValue(String str){
str = "aString";
}
public static void setValue(Person person){
person = new Person("aPerson");
}
public static class Person{
public Person(String name) {
this.name = name;
}
}
public static void main(String[] args) {
String str = "str";
setValue(str);
System.out.println(str); //str
Person person= null;
setValue(man);
System.out.println(man); //null
}
}