一、主要区别
1.StringBuffer: 对象可变的字符序列,对象是变量,在堆上
2.String: 对象不可变的字符序列,对象是常量,在常量池
3.String 作为参数传递类似于基本数据类型作为参数传递 (对象的不可改变性)。
4.StringBuffer 作为参数传递就是引用数据类型传递(对象可以改变)
二、String和StringBuffer作为参数传递的不同
为了更好的说明它们作为参数传递时有什么不同,我们通过一个例子来引入。
String作为参数传递
StringBuffer作为参数传递
总结:
String 作为参数传递类似于基本数据类型作为参数传递 (对象的不可改变性)。
StringBuffer 作为参数传递就是引用数据类型传递(对象可以改变)
public class StringBufferTest1 {
public static void main(String[] args) {
String s1 = "Hello";
String s2 = "world";
System.out.println("s1 = " + s1); // Hello
System.out.println("s2 = " + s2); // world
change(s1, s2);
System.out.println("s1 = " + s1); // Hello
System.out.println("s2 = " + s2); // world
System.out.println("----------------------------");
StringBuffer sb1 = new StringBuffer("Hello");
StringBuffer sb2 = new StringBuffer("world");
System.out.println("sb1 = " + sb1); // Hello
System.out.println("sb2 = " + sb2); // world
change(sb1, sb2);
System.out.println("sb1 = " + sb1); // Hello
System.out.println("sb2 = " + sb2); // worldworld
}
private static void change(StringBuffer sb1, StringBuffer sb2) {
sb1 = sb2;
sb2 = sb1.append(sb2);
}
private static void change(String s1, String s2) {
s1 = s2;
s2 = s1 + s2;
}
}
输出的结果如上面注释所示,可以知道因为StringBuffer的对象可以改变,输出后的值也发生了变化,再通过一张图来理解。
在图中,因为String类指向常量池,而StringBuffer类指向堆,虽然通过字符串拼接,string类创建了一个新的对象 ,但是并没有指向该对象地址,而StringBUffer类在对象本身进行了改变,地址仍然指向该对象,因此,可以更好的理解。
三、String和StringBuffer的相互转换
String-->StringBUffer
不能把字符串的值直接赋值给StringBuffer,
StringBuffer sb="hello";
那怎么转呢?
//方式1:通过构造方法
StringBuffer sb=new StringBuffer(s);
//方式2:通过append方法
StringBuffer-->String
StringBuffer buffer=new StringBuffer("java");
//方式1:通过构造方法
String str=new String(buffer);
//方式2:通过toString()方法
String str2=buffer.toString();