String 为 不可变对象 , StringBuffer为可变对象
String str = new String("x");
str.replace("x","y");
System.out.println(str);
的输出永远是x
只有 str = str.replace("x","y");
才会输出y
首先贴段无聊的代码:这种类型笔试题应该在C/C++中考查指针方面大量出现
String str = new String("aaa");
String str2 = new String("aaa");
System.out.println(str == str2);
String str3 = "bbb";
String str4 = "bbb";
System.out.println(str3 == str4);
String str5 = new String("ccc");
String str6 = "ccc";
System.out.println(str5 == str6);
String s = "hello";
String s1 = "hel";
String s2 = "lo";
System.out.println(s == s1 + s2);
System.out.println(s == "hel"+ "lo");
结果:
false
true
false
false
true
前面4个答案没有什么好说的,我主要说说最后一个输出, 因为最后一个牵扯到一个很容易弄混关于字符串相加的编程原则。
两个字符串相加会产生第三个字符串对象{String是不可变对象}。
str1+str2+...strn 会产生n-1个临时对象,那么避免大量无效对象的创建,所以提倡用stringbuffer.append()避免产生无效临时变量。
但是,第五个答案输出让人有点出任意料,string的 "=="操作符比较的为字符串地址,
s == "hel"+ "lo" 为 true 说明 两个常量字符串相加并未有产生一个新的String对象, 而是返回的是“hello”在常量池中的引用。{只有字符串对象相加是才会产生
一个新的对象, 所以对于常量字符串相加时用Stringbuffer并无多大意义}
那么这样就容易理解啦。
显而易见 <pre name="code" class="java">System.out.println(s == s1 + "lo"); 就会输出false啦。
stringbuffer为什么可变?
<pre name="code" class="java"> public final class StringBuffer
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
{
}
abstract class AbstractStringBuilder implements Appendable, CharSequence {
/**
* The value is used for character storage.
*/
char[] value;
}
答案很明显,stringbuffer的成员并非string, 而是char[]这样就容易理解啦