字符串拼接详解

1.使用 + 拼接字符串详解
// 源码
public class Demo02 {
    public static void main(String[] args) {
        String sb = new String();
        for (int i = 0; i < 10; i ++){
            sb += i;
        }
        System.out.println(sb);
    }
}

// 字节码(javac Demo02.java,javap -c Demo02.class)
Compiled from "Demo02.java"
public class Demo02 {
  public Demo02();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: new           #2                  // class java/lang/String
       3: dup
       4: invokespecial #3                  // Method java/lang/String."<init>":()V
       7: astore_1
       8: iconst_0
       9: istore_2
      10: iload_2
      11: bipush        10
      13: if_icmpge     41
      16: new           #4                  // class java/lang/StringBuilder
      19: dup
      20: invokespecial #5                  // Method java/lang/StringBuilder."<init>":()V
      23: aload_1
      24: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      27: iload_2
      28: invokevirtual #7                  // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
      31: invokevirtual #8                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      34: astore_1
      35: iinc          2, 1
      38: goto          10
      41: getstatic     #9                  // Field java/lang/System.out:Ljava/io/PrintStream;
      44: aload_1
      45: invokevirtual #10                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      48: return
}
2.使用StringBuilder拼接字符串详解
// 源码
public class Demo01 {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 10; i ++){
            sb.append(i);
        }
        System.out.println(sb.toString());
    }
}

// 字节码(javac Demo01.java,javap -c Demo01.class)
Compiled from "Demo01.java"
public class Demo01 {
  public Demo01();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: new           #2                  // class java/lang/StringBuilder
       3: dup
       4: invokespecial #3                  // Method java/lang/StringBuilder."<init>":()V
       7: astore_1
       8: iconst_0
       9: istore_2
      10: iload_2
      11: bipush        10
      13: if_icmpge     28
      16: aload_1
      17: iload_2
      18: invokevirtual #4                  // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
      21: pop
      22: iinc          2, 1
      25: goto          10
      28: getstatic     #5                  // Field java/lang/System.out:Ljava/io/PrintStream;
      31: aload_1
      32: invokevirtual #6                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      35: invokevirtual #7                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      38: return
}

总结

对比字节码,我们会发现 + 拼接已经用StringBuilder优化,但是 + 每拼接一次就会比直接用StringBuilder多创建一个对象多调用一次toString,效率比较低创建多余对象,所以还是推荐使用StringBuilder。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、字符串在C#中,字符串是一系列不可修改的Unicode字符,创建字符串后,就不能修改它。要创建字符串,最常用的...
    CarlDonitz阅读 5,110评论 0 2
  • 转载请注明出处: Java 字符串拼接效率分析及最佳实践 本文来源于问题 Java字符串连接最佳实践? java连...
    疯狂的爱因斯坦阅读 4,204评论 0 3
  • 一、String 类 1、定义: 1、从概念上讲,java字符串就是Unicode字符序列。每个用双引号括起来的字...
    玉圣阅读 5,616评论 0 1
  • 母亲节是每年5月份第二个星期日,每年都会是不同的日子,唯有对母亲的爱不变。母亲节是美国节日,全球化以来,各个国家的...
    maygleam阅读 3,790评论 1 3
  • 我不需要穿少短的外衣来争取目光,不喜欢穿低胸露背的衣服来证明胸大性感,不穿高跟鞋体现苗条,不会用娇滴滴和笑容征服...
    日月照余生阅读 1,580评论 0 0

友情链接更多精彩内容