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的值是可以改变的,形参的值改变也会影响实参的值。