String、StringBuilder与StringBuffer区别:运算速度与线程安全性全面解析
这三个类主要有两个方面的区别。其一在于运算速度,也就是运算性能或者执行效率。其二在于线程安全性。

通常情况下,运算速度的比较为:StringBuilder 的运算速度比 String 快,StringBuffer 的运算速度也比 String 快,且 StringBuilder 的运算速度比 StringBuffer 快。
String 是 final 类,这意味着它不能被继承。它是字符串常量。而 StringBuilder 和 StringBuffer 则均为字符串变量。String 对象创建后就不能更改了,而后两者是可以更改的。它们只能借助构造函数来创建对象,并且在对象创建之后,会在内存中分配内存空间,一开始会保存一个 null。可以通过 append 方法给 StringBuffer 和 StringBuilder 赋值。请看以下示例代码:
String str = "abc";
System.out.println(str);
str = str + "de";
System.out.println(str);
上述代码首先创建一个 String 对象 str,接着给 str 赋值为 abc。随后运行到第三行时,JVM 会创建一个新的 str 对象,将原来 str 的值与 de 相加后再赋值给新的 str。与此同时,第一个创建的 str 对象被 JVM 的垃圾回收机制(GC)回收掉。因此,str 实际上并未被更改,也就是说 String 对象一旦创建就不可更改。Java 中对 String 对象进行操作时,实际上是在不断创建新对象并且回收旧对象。所以在运行速度方面会比较慢。
StringBuilder 和 StringBuffer 的对象属于变量。对变量进行操作时,是直接对该对象进行更改。由于这种方式,不会进行反复的创建和回收。所以在运行速度方面比较快。
String str = "abc" + "de";
创建了一个 StringBuilder 对象,然后使用 append 方法依次添加了 "abc" 和 "de" 。
System.out.println(str);
System 把 stringBuilder 转换后的字符串进行输出显示。
上述代码中,String 的操作速度比 StringBuilder 快。这是因为在 JVM 看来,第 1 行的代码操作与下列代码完全相同,所以速度很快。
String str = "abcde";
以下这种代码写法形式速度会比较慢,因为 JVM 会持续不断地创建和回收对象来进行相关操作。
String str1 = "abc";
String str2 = "de";
String str = str1 + str2;
2. 线程安全性
StringBuilder(非线程安全)
StringBuilder 的方法没有特定关键字修饰,因此无法保证线程安全性。它是在 JDK1.5 中新增的,此类提供了与 StringBuffer 兼容的 API,但不能保证同步,所以在性能方面较高。该类被设计用作 StringBuffer 的简易替换,常用于字符串缓冲区被单个线程使用的情况(这种情况较为普遍)。如果可以的话,建议优先选用这类。因为在多数的实现里,它比 StringBuffer 速度更快。这两者的方法大致是相同的。
StringBuffer(线程安全的)
StringBuffer 中的大部分方法都被 synchronized 关键字修饰了。在需要的时候,可以对这些方法进行同步操作。这样一来,在任意特定的实例上,所有的操作就仿佛是以串行的顺序发生的。这个顺序与所涉及的每个线程进行的方法调用顺序是一致的。所以,StringBuffer 是线程安全的。它类似于 String 的字符串缓冲区,并且不能被修改。它在任意时间点上都包含某种特定的字符序列。通过某些方法调用能够改变该序列的长度和内容。StringBuffer 上的主要操作是 append 方法和 insert 方法。这些方法可被重载,以接受任意类型的数据。每个方法都能把给定的数据有效地转换成字符串,接着把该字符串的字符追加到字符串缓冲区里,或者把字符插入到字符串缓冲区中。append 方法总是把这些字符添加到缓冲区的末尾;而 insert 方法是在指定的点添加字符。
3. 总结
String:适用于少量的字符串操作。
StringBuilder 适用于在单线程环境下,对字符串缓冲区进行大量的操作。
StringBuffer 适用于在多线程环境下,对字符串缓冲区进行大量的操作。
java中stringbuffer转,java string stringbuilder stringbuffer
string Java 中 属于什么数据类型 (stringbuffer与stringbuilder的区别)
string.h是什么头文件 (stringbuffer与stringbuilder的区别)
String Linux下的字符串 操作 (stringbuffer与stringbuilder的区别)
string如何 (stringbuffer与stringbuilder的区别)
java中string和string,java中string与stringbuffer区别
Java中String StringBuilder和StringBuffer的区别 (java中string属于什么类型)