String、StringBuffer 和 StringBuilder

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 是线程安全的,但因此开销比较大。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1. Java中的多态性理解(注意与C++区分) Java中除了static方法和final方法(private方...
    小敏纸阅读 5,312评论 0 19
  • 有关String的源码分析,可以查看一下我的前一篇文章:String源码分析 要理解String的拼接过程,先要理...
    小帝Ele阅读 4,280评论 0 2
  • 下面说一些平时可能不太注意的知识点: String 对象具有只读特性,所以指向它的任何引用都不可能改变它的值,因此...
    扈扈哈嘿阅读 2,920评论 0 1
  • 夕阳下的幽灵 走进了半夜狂欢的转角 得不到的躁动 就像左手握着香槟 右手搀着细腰 夜幕垂临 树下的一双发光的眼睛 ...
    夫子闲云孙宁富阅读 1,450评论 0 3
  • 【成为更好的自己】2016年记录(day9) 2016年,她她四个年头。从熟悉的幼儿园去到了新的大幼儿园,跟着我们...
    阿果MePlus阅读 3,873评论 0 0

友情链接更多精彩内容