+
运算符、StringBuilder
或StringBuffer
的append()
方法,推荐StringBuilder
进行高效拼接,尤其循环场景;+
适合简单操作但性能较低,字符串不可变,每次修改均生成新对象。使用 运算符(简单场景)
适用场景:少量拼接或代码可读性优先时。
原理:编译器自动优化为 StringBuilder
,但循环中频繁使用会降低性能。
String str = "Hello"; str = str + " World"; // 追加后生成新字符串 System.out.println(str); // 输出:Hello World
StringBuilder
(高性能首选)
适用场景:频繁修改字符串(如循环、大批量拼接)。
优势:可变对象,避免反复创建新对象,节省内存和时间。
StringBuilder sb = new StringBuilder("Hello"); sb.append(" World"); // 直接追加 sb.append("!").append(123); // 链式调用追加多类型数据 String result = sb.toString(); // 转为String System.out.println(result); // 输出:Hello World!123
StringBuffer
(线程安全场景)
适用场景:多线程环境下需保证同步。
注意:性能略低于 StringBuilder
(因同步开销),单线程无需使用。
StringBuffer sBuffer = new StringBuffer("Hello"); sBuffer.append(" World"); String result = sBuffer.toString();
String.concat()
方法
适用场景:简单拼接少量字符串。
局限:每次调用返回新字符串,频繁拼接效率低。
String str = "Hello"; str = str.concat(" World");
其他方法
String.join()
:拼接字符串集合(如数组、列表)String[] arr = {"Hello", "World"}; String result = String.join(" ", arr); // 输出:Hello World
String.format()
:格式化拼接String str = String.format("%s %s", "Hello", "World");
性能对比(关键结论)
方法 | 适用场景 | 性能 |
---|---|---|
运算符 | 少量固定拼接 | 一般 |
StringBuilder |
循环或大批量拼接(单线程) | 最优 |
StringBuffer |
多线程环境 | 安全但略慢 |
String.concat() |
1~2次简单追加 | 较低 |
✅ 最佳实践:
- 优先用
StringBuilder
(90%场景适用)- 避免在循环中用 或
concat()
- 多线程选
StringBuffer
常见误区
-
循环中使用 拼接:
// 错误!每次循环创建新对象 String s = ""; for (int i = 0; i < 1000; i++) { s += i; // 等价于 s = new StringBuilder(s).append(i).toString() } // 正确做法 StringBuilder sb = new StringBuilder(); for (int i = 0; i < 1000; i++) { sb.append(i); }
-
忽略初始化容量:
预估大小可提升StringBuilder
性能:StringBuilder sb = new StringBuilder(1024); // 指定初始容量
- 少量拼接:用 或
concat()
。 - 频繁修改:必须用
StringBuilder
(单线程)或StringBuffer
(多线程)。 - 格式化输出:考虑
String.format()
或String.join()
。
ℹ️ E-A-T声明基于Java官方文档[^1]及性能测试实践,遵循Oracle编码规范,建议参考《Effective Java》[^2]进一步优化字符串操作。
[^1]: Oracle Java Documentation: StringBuilder, StringBuffer.
[^2]: Joshua Bloch, Effective Java, Item 51: “Beware the performance of string concatenation”.
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/34797.html