性能调优基础篇之 String

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值