String、StringBuffer 和 StringBuil

2017-10-25  本文已影响0人  黑色偏幽默

String、StringBuffer 和 StringBuilder

不可变的 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 赋值。

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

上一篇 下一篇

猜你喜欢

热点阅读