《Java零基础教学》是一套深入浅出的 Java 编程入门教程。全套教程从Java基础语法开始,适合初学者快速入门,同时也从实例的角度进行了深入浅出的讲解,让初学者能够更好地理解Java编程思想和应用。
本教程内容包括数据类型与运算、流程控制、数组、函数、面向对象基础、字符串、集合、异常处理、IO 流及多线程等 Java 编程基础知识,并提供丰富的实例和练习,帮助读者巩固所学知识。本教程不仅适合初学者学习,也适合已经掌握一定 Java 基础的读者进行查漏补缺。
前言
作为一个在职场有多年经验的Java码农,在我所有的项目开发的过程中,经常会遇到关于字符串处理的相关问题。无论是日常的字符串拼接、格式化,还是处理大量文本数据时,Java它本身就提供了三种常用的类来操作字符串:String
、StringBuilder
和 StringBuffer
。这三者之间看似相似,但在性能、线程安全、使用场景等方面却有着很大的区别。
因此,在本期内容中,我将结合自己多年的开发经验,深入剖析这三者的区别,并帮助大家选择最合适的类来处理字符串操作问题,避免性能瓶颈和不必要的错误,仔细看,好好学哈。
1. String:不可变的字符串
1.1 什么是String?
String
是Java中最常用的类之一,它是不可变 的(immutable)。这意味着,String
对象一旦创建,它的值就不能被修改。如果你对String
对象执行任何操作(如拼接、替换等),都会创建一个新的String
对象,而不是在原对象上进行修改。
特点:
- 不可变性 :
String
对象的值一旦创建,就无法改变。 - 线程安全 :由于
String
是不可变的,它是线程安全的,可以在多个线程之间共享。 - 内存优化 :Java通过字符串常量池来优化内存,对于相同的字符串文字(literal),只会存储一份。
示例:不可变性
接着,我给大家展示下,结合理论与实战给大家把知识点讲透,案例代码如下:
java
/**
* @Author wf
* @Date 2025-08-23 10:02
*/
public class Test1 {
public static void main(String[] args) {
String str1 = "Hello";
String str2 = str1; // 赋值后,str2指向str1
str1 = "World"; // 创建了一个新的String对象,str1指向新对象
System.out.println("str1: " + str1); // 输出: World
System.out.println("str2: " + str2); // 输出: Hello
}
}
在上面的代码中,虽然我们修改了str1
,但是str2
依然指向原始的"Hello"
字符串。这是因为String
对象不可变,修改后会重新创建一个新的String
对象。
根据如上案例,本地实际结果运行展示如下,仅供参考:

1.2 使用场景
- 适用于常量或短期使用的字符串 :如果你的字符串不需要频繁修改(比如配置文件、常量字符串),使用
String
是非常合适的。 - 线程安全的场景 :因为
String
是不可变的,可以在多个线程之间共享。
1.3 性能问题
- 拼接问题 :
String
拼接时,通常会创建大量新的String
对象,这可能导致不必要的内存开销,尤其是在大量字符串拼接的情况下。
2. StringBuilder:高效的可变字符串
2.1 什么是StringBuilder?
StringBuilder
是一个可变的字符序列类,它是专门为性能优化 设计的。StringBuilder
允许我们修改字符串内容,而不会每次修改时都创建新的对象。
特点:
- 可变性 :
StringBuilder
的内容可以在原有对象上进行修改,而不会创建新的对象。 - 非线程安全 :
StringBuilder
不是线程安全的,适用于单线程环境。 - 高效 :因为它允许在同一个对象中修改字符串,因此对于大量的字符串操作来说,比
String
更高效。
示例:使用StringBuilder进行字符串拼接
接着,我给大家展示下,结合理论与实战给大家把知识点讲透,案例代码如下:
java
/**
* @Author wf
* @Date 2025-08-23 10:02
*/
public class Test2 {
public static void main(String[] args) {
StringBuilder builder = new StringBuilder("Hello");
builder.append(" World"); // 拼接
builder.append("!");
System.out.println(builder.toString()); // 输出: Hello World!
}
}
在这个例子中,我们用StringBuilder
来拼接字符串,而不是每次都创建新的String
对象。StringBuilder
直接在内存中修改内容,避免了不必要的内存开销。
根据如上案例,本地实际结果运行展示如下,仅供参考:

2.2 使用场景
- 频繁修改字符串的场景 :如果你需要进行大量的字符串拼接或修改,
StringBuilder
是最佳选择。 - 单线程环境 :如果你的应用程序不涉及多线程,
StringBuilder
可以提供更好的性能。
2.3 性能优势
- 高效拼接 :
StringBuilder
在拼接时不会创建新的对象,而是修改内部字符数组,因此比String
更节省内存,性能也更高。
性能对比:String与StringBuilder拼接
接着,我给大家展示下,结合理论与实战给大家把知识点讲透,案例代码如下:
java
/**
* @Author wf
* @Date 2025-08-23 10:02
*/
public class Test3 {
public static void main(String[] args) {
long startTime = System.nanoTime();
String str = "";
for (int i = 0; i < 10000; i++) {
str += "a"; // 每次拼接都会创建新的String对象
}
long endTime = System.nanoTime();
System.out.println("String拼接耗时: " + (endTime - startTime));
startTime = System.nanoTime();
StringBuilder builder = new StringBuilder();
for (int i = 0; i < 10000; i++) {
builder.append("a"); // 直接修改StringBuilder对象
}
endTime = System.nanoTime();
System.out.println("StringBuilder拼接耗时: " + (endTime - startTime));
}
}
输出:
json
String拼接耗时: 63374400
StringBuilder拼接耗时: 272100
可以看到,在大量拼接时,StringBuilder
比String
更高效,尤其是在大量拼接字符串时,性能差距更明显。
根据如上案例,本地实际结果运行展示如下,仅供参考:

3. StringBuffer:线程安全的字符串构造
3.1 什么是StringBuffer?
StringBuffer
是类似于StringBuilder
的一个类,提供了可变的字符串操作。与StringBuilder
不同的是,StringBuffer
是线程安全的,它通过对方法加锁来确保线程安全。
特点:
- 可变性 :
StringBuffer
的内容是可变的,可以在原有对象上修改。 - 线程安全 :
StringBuffer
通过同步方法来保证线程安全,适用于多线程环境。 - 性能较低 :由于线程同步的开销,
StringBuffer
比StringBuilder
的性能差一些。
示例:线程安全的字符串拼接
接着,我给大家展示下,结合理论与实战给大家把知识点讲透,案例代码如下:
java
/**
* @Author wf
* @Date 2025-08-23 10:02
*/
public class Test4 {
public static void main(String[] args) {
StringBuffer buffer = new StringBuffer("Hello");
buffer.append(" World");
buffer.append("!");
System.out.println(buffer.toString()); // 输出: Hello World!
}
}
与StringBuilder
类似,StringBuffer
也可以用于拼接字符串,但它的append
方法是线程安全的,这意味着在多线程环境下,它可以安全地进行字符串拼接。
根据如上案例,本地实际结果运行展示如下,仅供参考:

3.2 使用场景
- 多线程环境 :当多个线程需要操作同一个字符串对象时,使用
StringBuffer
可以确保线程安全。 - 性能要求不是特别高的场景 :由于线程同步的开销,如果是单线程环境,
StringBuilder
通常会更高效。
4. 选择哪个?根据你的需求来定
4.1 使用String
- 常量字符串 :如果字符串是固定的,不会频繁修改(例如配置文件、常量等),使用
String
最合适。 - 线程安全的共享 :如果多个线程共享同一个字符串,并且不需要修改,
String
是理想的选择。
4.2 使用StringBuilder
- 单线程、大量字符串拼接 :如果你需要在单线程中频繁拼接字符串,
StringBuilder
是性能最优的选择。它不会创建多余的对象,且内存开销低。 - 性能要求高的场景 :如果你正在处理大量数据或需要高性能,
StringBuilder
能帮助你显著提升效率。
4.3 使用StringBuffer
- 多线程的字符串拼接 :如果你需要确保多线程环境下的线程安全,并且不介意一定的性能开销,
StringBuffer
可以帮助你保证数据的正确性。
5. 总结
在Java中,String
、StringBuilder
和StringBuffer
有着各自的优势和应用场景。理解它们之间的差异,能够帮助我们在不同的场景中做出正确的选择,从而提高代码的性能和可维护性。
String
:适用于不需要修改的字符串,支持常量池,线程安全,但在拼接时效率较低。StringBuilder
:适用于单线程环境中需要频繁修改字符串的场景,性能优于String
和StringBuffer
,但不线程安全。StringBuffer
:适用于多线程环境中的字符串拼接,线程安全,但性能稍逊色于StringBuilder
。
总言之,通过合理选择和使用这三者,我们可以让代码更加高效、简洁,并且避免性能瓶颈,写出真正优雅的代码。
最后
大家如果觉得看了本文有帮助的话,麻烦给不熬夜崽崽点个三连(点赞、收藏、关注)支持一下哈,大家的支持就是我写作的无限动力。