就标题而言,我们先来讨论讨论String与StringBuffer及StringBuilder的区别。
String 内容不可变的,而StringBuffer StringBuilder 内容都是可变的。
StringBuffer是线性安全的,但是效率低。
StringBuilder是线性不安全的,但是效率高。
StringBuffer 与数组有什么区别?
两者都可以看作容器来撞入其他数据,但是StringBuffer的最终数据是一个字符串数据,
而数组可以放置多种数据,但必须是同一种数据。
形参问题
我们看下面一段代码,来是分析结果--->
public class StringDemo {
public static void main(String[] args) {
String s1 = "Hello";
String s2 = "World";
System.out.println(s1 + "----" + s2);
change(s1, s2);
System.out.println(s1 + "----" + s2);
StringBuffer s3 = new StringBuffer(s1);
StringBuffer s4 = new StringBuffer(s2);
System.out.println(s3 + "----" + s4);
change(s3, s4);
System.out.println(s3 + "----" + s4);
}
public static void change(String s1, String s2) {
s1 = s2;
s2 = s1+s2;
}
public static void change(StringBuffer s3, StringBuffer s4) {
s3 = s4;
s3 = s3.append(s4);
}
}
---------建议自己思考一下结果。
结果:
Hello----World
Hello----World
Hello----World
Hello----WorldWorld
看到结果,是否与自己想到的相同,如果不同,让我来看看为啥子不同?
加断点调试:
进入方法,进入22行,看结果,发现s1 变了:
切换到main方法,发现s1 没有变化:
继续走,走到第二个change方法,查看结果:
发现结果是:Hello----World。
原因在于String 在形式参数中 在这里是一个常量,所以内容不会变化。
我们继续走,进入change方法中,观察结果:
最后s4 结果变化了。
原因在于s3 = s4 的时候是引用,所以s3.append(s4)其实相当于s4.append(s4),所以s4 为WorldWorld。然后有 s3 = s3.append(s4);即相当于s3 = s4了,不会产生那个影响。
最后为啥s3 没有发生变化呢?与上面一样了在形式参数中 在这里是一个常量。
嗯大概就是这个样子了!
若有错误,欢迎留言指导!!