天天看点

String 和 StringBuffer的区别

public class Test {

public static void stringReplace (String text) {

text = text.replace('j' , 'i');

}

public static void bufferReplace (StringBuffer text) {

text = text.append("C");

}

public static void main (String args[]) {

String textString = new String ("java");

StringBuffer textBuffer = new StringBuffer ("java");

stringReplace (textString);

bufferReplace (textBuffer);

System.out.println (textString + textBuffer);

}

}

答案是 javajavaC

这是Java参数传递(by value)造成的,是不可变的(immutable).,例如 基本类型,String传值,复制了值传递过去;可变的(Object)传值,复制了引用传递过去。

而题目中第七行text = text.append (“C”),append方法会改变text中的值

而这个text与main中的textBuffer是指向同一个对象,所以对应的输出是javac。

string的值永远不会改变!

String a = "a";//假设a指向地址0x0001,

a = "b";//重新负值后a指向地址0x0002,但0x0001地址中保存的"a"依旧存在,但已经不再是a所指向的。

从表面上看String类型的对象改变了值,但事实是他不能改变值,只能改变指向的地址

StringBuffer则不同,直接改变指向的地址中保留的值

还有

StringBuffer s1 = new StringBuffer("a");

StringBuffer s2 = new StringBuffer("a");

s1.equals(s2)//为什么是false

String s1 = new String("a");

String s2 = new String("a");

s1.equals(s2)//为什么是true

StringBuffer类中没有重新定义equals这个方法,因此这个方法就来自Object类,

而Object类中的equals方法是用来比较地址的,所以等于false.

String类中重新定义了equals这个方法,而且比较的是值,而不是地址。所以会是

true。