本篇我们来理解下String和StringBuffer分别作为参数传递会发生什么,其值到底会不会发生改变。然后总结一下String和StringBuffer和StringBuilder三者的区别,作为结束String和StringBuffer类的学习。
一个带参数的方法,参数是可以是基本数据类型,也可以是引用数据类型。之前我们有这么一个理论。如果基本数据类型作为参数传递,值是不会发生改变。如果引用数据类型作为参数传递,其值会发生改变。那么我们就来看看String和StringBuffer作为参数传递,其值到底会不会发生变化。
1.String类对象作为参数传递
package string;
public class Dem04_StringAndStringBuffer {
public static void main(String[] args) {
Strings = "Anthony";
System.out.println(s);
change(s);
System.out.println(s);
}
public static void change(String s) {
s += "Liu";
}
}
运行结果:Anthony 和Anthony
解释:
为什么第二个输出没有打印“AnthonyLiu”? 在执行change()方法的时候,在方法局部内,S的值确实是“AnthonyLiu”, 但是当change()方法弹出栈内存,局部变量S变成了垃圾会被JVM回收。所以第二行打印的s,依然是Main方法里的指向常量池中“Anthony”对象的引用,所以打印出来,值没有发生改变。结论:String对象作为参数传递,其值没有改变,和基本数据类型一样。
2.StringBuffer对象作为参数传递
package string;
public class Dem04_StringAndStringBuffer {
public static void main(String[] args) {
StringBuffersb = new StringBuffer();
sb.append("Anthony");
System.out.println(sb);
change(sb);
System.out.println(sb);
}
publicstaticvoid change(StringBuffer s) {
s.append("Liu");
}
}
输出结果:Anthony 和AnthonyLiu
解释:
第一句代码是新建一个StringBuffer对象,字符为空,执行第二行的apend方法之后,sb的值肯定变成了“Anthony”,这个时候sb是一个对象引用,指向了“Anthony”这个对象。接下来,调用change方法,new StringBuffer()作为参数传递,赋值给了形式参数s,所以s的值变成了“Anthony”,在执行change方法,相当于在“Anthony”的基础上加上了“Liu”,所以,上面其实是两个对象(new StringBuffer和形式参数的s)都指向同一个引用(sb),所以, StringBuffer作为参数传递,是引用类型的传递。
3.String和StringBufferStringBuilder的区别
关于String和StringBuffer或者StringBuffer和StringBuilder区别,在面试过程必考的问题。
1)Sting 和StringBuffer的区别
String是字符串常量,一旦创建就不能改变。StringBuffer是字符串缓冲区,可以通过apend和insert进行长度和内容的改变。
2)StringBuffer和StringBuilder的区别
如果你打开API中搜索,StringBuilder,可以发现,和StringBuffer的构造方法和类方法都一模一样。主要从以下几点回答
StringBuffer:
1.版本,从Java1.0版本就有这个类
2.线程同步
3.线程安全
4.效率低
StringBuilder:
1.版本,从Java 1.5开始出现
2.线程不同步
3.线程不安全
4.效率高
其实线程的同步和安全和效率都是一个整体条件出现(线程同步就必安全,就必效率低),不能单独拆分出来理解,本身就是线程相关的知识。