性能调优基础篇之 String

来源:互联网 发布:网络推广证书 编辑:程序博客网 时间:2024/06/10 07:14

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[]这样就容易理解啦




0 0
原创粉丝点击