String、StringBuilder与StringBuffer区别:运算速度与线程安全性全面解析

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

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中什么是冒泡,冒泡算法

2026年09月06日

27阅读

java中冒号,java双冒号

2026年09月06日

26阅读

java中的->,java中的是什么意思

2026年09月06日

24阅读

java中的super用法,Java中super的说明

2026年09月06日

28阅读

java中反射的应用,java中反射的应用场景

2026年09月06日

26阅读

java中开关的定义,Java关键字有哪些

2026年09月06日

26阅读