您的位置:首页 > Web前端

String 和StringBuffer 在传递过程中的区别

2016-02-22 09:38 916 查看
1:看下面一段程序,对比区别:

public class StringTest {

public static void main(String[] args) {

String aString = “helloword”;

String bString = “helloword”;

aString = aString.replace(‘h’, ‘d’);

aString = aString.replace(‘l’, ‘b’);

System.out.println(aString);

//经过jdk编译优化后,使得astring 和 bstring 都是指向了同一个内存空间。

System.out.println(aString == bString);

String aString2 = new String(aString);
String bString2 = new String(bString);
//由于是new的形式,所以在内存中是不可能为同一个对象的,也就是地址不可能相同,
//aString2 == bString2比较的是地址引用,所以不相等
//aString2.equals(bString2)比较的是值,所以值相等。
System.out.println(aString2 == bString2);
System.out.println(aString2.equals(bString2));

StringBuffer aStringBuffer = new StringBuffer("helloword");
StringBuffer bStringBuffer = new StringBuffer("helloword");
//由于是new的形式,所以在内存中是不可能为同一个对象的,也就是地址不可能相同,

//aStringBuffer == bStringBuffer比较的是地址引用,所以不相等
System.out.println(aStringBuffer == bStringBuffer);
//aString2.equals(bString2)也是不相等,情况不明。
System.out.println(aStringBuffer.equals(bStringBuffer));
//转化为字符串后在进行比较就可以了。
System.out.println(aStringBuffer.toString().equals(bStringBuffer.toString()));

appengd(aStringBuffer, bStringBuffer);
System.out.println(aStringBuffer  + "  " + bStringBuffer);
}

public static void changeForString(String a,String b){
//由于String的值一旦被初始化就不能够改变,只能够重新分配内存空间来生成另一个对象
//因而a = a+b;这句话的意思是:将a、b的值连接起来生成一个新的对象"ab",再让a指向它,但是原先的aString对象还是只想原来的对象“helloWord”
a = a.concat(b);
b=a;
}

public static void appengd(StringBuffer a,StringBuffer b){
//StringBuffer是能够改变自身的值得,所以这会改变原有的值,而不是另外生成一个对象,
//又由于a和aStringBuffer都指向了同一个对象,所以aStringBuffer的值也改变了
a.append(b);
//当前b指向了和a、aStringBuffer一样的对象,但是原本的bStringBuffer指向的对象并没有变化
b = a;
}


}

总结:String 和 StringBuffer 都是引用传递,形参和实参都是指向同一个对象。

但是由于String的值一旦被初始化就不能够改变,只能够重新分配内存空间来生成另一个对象。所以形参怎么改变都不会影响到实参的值

而StringBuffer的值是可以改变的,形参的值改变也会影响实参的值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  stringbuffer string