日期:2014-05-20  浏览次数:20776 次

StringBuilder的append方法和String+String的区别?

StringBuilder sb = new StirngBuilder();
sb.append("a").append("b").append("c").append("d");





String str = "";
str += "a";
str += "b";
str += "c";
str += "d";


在上面的例子中,“a”、“b”、“c”、“d”都应该会首先在常量池中分配空间吧,这样上面两端代码就应该差不多啊,但为什么是第一段代码效率更高呢?求解释

------解决方案--------------------
str += "a"; 你要分解来看:
str = str + "a";

而str + "a" 会创建一个新的String对象,就慢了。你要知道String对象一旦创建就是不能被改变的,要达到字符串拼接的效果,就得不停创建新对象。

StringBuilder直到最后sb.toString()才会创建String对象,之前都没有创建新对象(在你的例子中是的,但是如果你append的总长度超过一定范围——默认是16——就会创建一个新的数组,来装下更多的String)
------解决方案--------------------
StringBuilder和StringBuffer,字符串是存放在char[]中的,char[]是存放在堆中的。
相比String每次+都重新创建一个String对象,重新开辟一段内存不同,StringBuilder和StringBuffer的append都是直接把String对象中的char[]的字符直接拷贝到StringBuilder和StringBuffer的char[]上,效率比String的+高得多。当然,当StringBuilder和StringBuffer的char[]长度不够时,也会重新开辟一段内存。

另外,StringBuffer是线程安全的,StringBuilder不是线程安全的。

------解决方案--------------------
javac会把 str += "b"; 变成一个StringBuilder的append 操作。
相当于一个 new StringBuilder().append("a").append("b").toString().

比自己调用append费事多了。
        StringBuilder builder = new StringBuilder("a");
        String s = builder.append("b").append("c").append("d").toString();

        String a = "a";
        a += "b";
        a += "c";
        a += "d";

javap -c 的输出:
    Code:
       0: new           #2                  // class java/lang/StringBuilder