Java递归反转字符串后res变量输出为空,原因是什么?
问题分析:调用reverse方法后res为空的原因
调用代码
String res = ""; Solution.reverse("hellowolrd", res); System.out.println(res);
reverse方法实现
public static void reverse(String str, String result) { if(str.length()==0) return; result += str.charAt(str.length()-1); reverse(str.substring(0,str.length()-1),result); }
问题
调用reverse()方法后,打印res变量却显示为空,这是什么原因?
原因解析
核心问题出在Java的String不可变性和参数传递机制:
- String是不可变类型,一旦创建就无法修改,任何看似修改的操作(比如
+=)都会生成新的String对象。 - 方法参数传递的是值的副本:你传入的
res是一个空字符串,方法内的result只是它的副本,两者指向完全不同的对象。 - 递归过程中,每次
result += ...都会创建新的String对象并赋值给方法内的result,但这个修改完全不会影响外部的res变量。最终外部的res始终是最初的空字符串,所以打印结果为空。
修复方案
方案1:让方法返回修改后的字符串
修改reverse方法,让它每次递归返回更新后的字符串,外部接收返回值更新res:
public static String reverse(String str, String result) { if(str.length() == 0) return result; result += str.charAt(str.length() - 1); return reverse(str.substring(0, str.length() - 1), result); }
调用方式:
String res = ""; res = Solution.reverse("hellowolrd", res); System.out.println(res);
方案2:使用可变的StringBuilder容器
StringBuilder是可变的字符序列,传递的引用副本指向同一个对象,修改容器内容会直接反映到外部:
public static void reverse(String str, StringBuilder result) { if(str.length() == 0) return; result.append(str.charAt(str.length() - 1)); reverse(str.substring(0, str.length() - 1), result); }
调用方式:
StringBuilder res = new StringBuilder(); Solution.reverse("hellowolrd", res); System.out.println(res.toString());
内容的提问来源于stack exchange,提问作者Mert Pınarbaşı
相关产品推荐
相关产品推荐

