Java中如何绕过字符串不可变性?无返回值函数实现就地反转字符串
问题分析与解决方案
嘿,这个坑我刚学Java的时候也踩过!咱们先把问题的根儿说清楚:
Java里的String是不可变对象,而且方法参数是按值传递的。你在rev方法里做的s = sb.toString(),只是把方法内部的局部变量s指向了新的String对象,但main方法里的那个s引用完全不受影响——这俩根本不是同一个变量!所以你在方法里打印的是反转后的字符串,但main里输出的还是原来的。
那有没有不用返回值就能让main拿到反转结果的办法?有,但得借助引用类型的容器(比如数组、自定义包装类),因为引用类型传递的是引用的副本,这个副本指向的是同一个对象,修改对象内部的内容就能被外部感知到。
方案一:用String数组包装传递
这是最简单的办法,把String放到数组里,传递数组给rev方法,修改数组元素就能让main拿到结果:
import java.io.*; public class first { void rev(String[] sArr) { StringBuilder sb = new StringBuilder(sArr[0]); sb.reverse(); sArr[0] = sb.toString(); // 修改数组中的元素,外部数组会同步这个变化 } public static void main(String args[]) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Enter a string"); // 用数组把字符串包装起来 String[] sArr = {br.readLine()}; first fs = new first(); fs.rev(sArr); // 直接从数组里取反转后的结果 System.out.println(sArr[0]); } }
方案二:自定义包装类
如果觉得数组不够优雅,也可以自己写个简单的包装类:
class StringWrapper { String value; StringWrapper(String value) { this.value = value; } } import java.io.*; public class first { void rev(StringWrapper wrapper) { StringBuilder sb = new StringBuilder(wrapper.value); sb.reverse(); wrapper.value = sb.toString(); } public static void main(String args[]) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Enter a string"); StringWrapper wrapper = new StringWrapper(br.readLine()); first fs = new first(); fs.rev(wrapper); System.out.println(wrapper.value); } }
额外说明
其实Java设计上就不支持直接“就地修改”String,因为不可变性是String的核心特性(保证线程安全、缓存哈希值等)。所以更常规的做法还是让方法返回反转后的String,但既然你明确要求无需返回值,上面的两种容器方案就能解决问题。
内容的提问来源于stack exchange,提问作者Jitendra
相关产品推荐
相关产品推荐

