You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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şı

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 19:25:09