首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

StringBuilder的append步骤和String+String的区别

2013-08-04 
StringBuilder的append方法和String+String的区别?StringBuilder sb new StirngBuilder()sb.append(a

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


       3: dup
       4: ldc           #3                  // String a
       6: invokespecial #4                  // Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
       9: astore_1
      10: aload_1
      11: ldc           #5                  // String b
      13: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      16: ldc           #7                  // String c
      18: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      21: ldc           #8                  // String d
      23: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      26: invokevirtual #9                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      29: astore_2
      30: ldc           #3                  // String a
      32: astore_3
      33: new           #2                  // class java/lang/StringBuilder


      36: dup
      37: invokespecial #10                 // Method java/lang/StringBuilder."<init>":()V
      40: aload_3
      41: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      44: ldc           #5                  // String b
      46: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      49: invokevirtual #9                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      52: astore_3
      53: new           #2                  // class java/lang/StringBuilder
      56: dup
      57: invokespecial #10                 // Method java/lang/StringBuilder."<init>":()V
      60: aload_3
      61: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      64: ldc           #7                  // String c
      66: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      69: invokevirtual #9                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;


      72: astore_3
      73: new           #2                  // class java/lang/StringBuilder
      76: dup
      77: invokespecial #10                 // Method java/lang/StringBuilder."<init>":()V
      80: aload_3
      81: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      84: ldc           #8                  // String d
      86: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      89: invokevirtual #9                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      92: astore_3
      93: return

热点排行
Bad Request.