美文网首页
String、StringBuffer 和 StringBuil

String、StringBuffer 和 StringBuil

作者: 黑色偏幽默 | 来源:发表于2017-10-25 13:33 被阅读0次

    String、StringBuffer 和 StringBuilder

    不可变的 String

    • String 对象是不可变的。而每一个看起来会修改 String 值的方法,实际上都是创建了一个新的 String 对象。
    • 每次将 String 对象作为参数时,实际上传递的是一个引用的拷贝。

    String 重载 + 运算符

    我们经常使用加号来拼接运算符,这次来了解一下 + 是如何去拼接字符串的。

    public class Demo {
        public static void main(String[] args) {
            String str = new String("123");
            str += "456";
            System.out.println(str);
        }
    }
    

    上方几行代码简单的实现了字符串的拼接功能,我们使用指令 javap -c Demo后,得到以下的字节码:

    public static void main(java.lang.String[]);
        Code:
           0: new           #2                  // class java/lang/String
           3: dup
           4: ldc           #3                  // String 123
           6: invokespecial #4                  // Method java/lang/String."<init>":(Ljava/lang/String;)V
           9: astore_1
          10: new           #5                  // class java/lang/StringBuilder
          13: dup
          14: invokespecial #6                  // Method java/lang/StringBuilder."<init>":()V
          17: aload_1
          18: invokevirtual #7                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
          21: ldc           #8                  // String 456
          23: invokevirtual #7                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
          26: invokevirtual #9                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
          29: astore_1
          30: getstatic     #10                 // Field java/lang/System.out:Ljava/io/PrintStream;
          33: aload_1
          34: invokevirtual #11                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
          37: return
    

    可以看到字节码中,编译器 new 了一个 StringBuilder 对象,然后调用两次 append() 方法拼接字符串,最后调用 toString() 方法返回一个新的 String 对象,为 str 赋值。

    • 什么时候使用 StringBuilder?
      如果在 for 中使用 +/+= 拼接字符串,会在每次循环后创建一个新的 StringBuilder 对象,所以在循环时,使用 StringBuilder 代替 String 的拼接更加高效。

    • 什么时候使用 StringBuilder?
      StringBuilder 是在 JAVA SE5 引入的,而在这之前的 StringBuffer 是线程安全的,但因此开销比较大。

    实际上就是所有方法加同步而已。

    相关文章

      网友评论

          本文标题:String、StringBuffer 和 StringBuil

          本文链接:https://www.haomeiwen.com/subject/nqjqpxtx.html