concat(String str)
方法详解:字符串拼接
方法定义
public String concat(String str)
- 作用:将指定字符串拼接到当前字符串末尾
- 返回值:新字符串(原始字符串不变)
- 等效操作:
str1 + str2
- 空值处理:
- 若参数为
null
→ 抛出NullPointerException
- 若参数为空字符串 → 返回原始字符串
- 若参数为
功能说明
调用示例 | 返回值 | 说明 |
---|---|---|
"Hello".concat("World") |
"HelloWorld" |
基础拼接 |
"Java".concat("") |
"Java" |
空字符串不改变原串 |
"".concat("Start") |
"Start" |
空串作为起点 |
"A".concat(null) |
❌ NullPointerException |
不允许 null 参数 |
"1".concat("2").concat("3") |
"123" |
链式调用 |
示例代码
基础拼接
String firstName = "John";
String lastName = "Doe";
String fullName = firstName.concat(" ").concat(lastName);
// "John Doe"
路径拼接
String basePath = "/var/log/";
String fileName = "app.log";
String fullPath = basePath.concat(fileName);
// "/var/log/app.log"
批量拼接(不推荐)
// 错误示范:产生中间字符串浪费内存
String result = "";
for (int i = 0; i < 100; i++) {
result = result.concat(String.valueOf(i)); // 每次创建新对象
}
使用技巧
简单场景替代
+
运算符:// 等效写法 String s1 = "Hello" + "World"; String s2 = "Hello".concat("World");
链式拼接:
String version = "v" .concat("1") .concat(".") .concat("0"); // "v1.0"
空值安全处理:
String safeConcat(String base, String addition) { return base.concat(addition == null ? "" : addition); }
常见错误与注意事项
忽略不可变性:
String original = "Hello"; original.concat(" World"); // ❌ 原始字符串不变 System.out.println(original); // 输出 "Hello"
循环拼接性能陷阱:
// 时间复杂度 O(n²) for (int i = 0; i < 10000; i++) { str = str.concat("x"); // 每次创建新字符串 }
null
参数处理:String text = "Info: "; text.concat(getData()); // 若getData()返回null则崩溃
最佳实践与性能优化
优先使用
StringBuilder
:// 高效拼接(时间复杂度 O(n)) StringBuilder sb = new StringBuilder(); for (int i = 0; i < 10000; i++) { sb.append("x"); } String result = sb.toString();
单行拼接选择依据: | 场景 | 推荐方式 | 原因 | |------|----------|------| | 字面量拼接 |
"a" + "b"
| 编译器优化为常量 | | 变量简单拼接 |str1 + str2
| 代码更简洁 | | 链式拼接 |concat()
| 避免歧义 |Java 8+ 高效替代方案:
// 使用String.join String joined = String.join("", "A", "B", "C"); // "ABC" // Stream API String streamResult = Stream.of("Java", "is", "cool") .collect(Collectors.joining(" ")); // "Java is cool"
性能对比: | 方法 | 1000次拼接耗时 | 内存占用 | |------|----------------|----------| |
concat()
| 15 ms | 高 (频繁创建对象) | |+
运算符 | 12 ms | 中等 | |StringBuilder
| 0.5 ms | 低 (单对象操作) | |String.join()
| 1 ms | 低 |
总结
特性 | concat() |
+ 运算符 |
StringBuilder |
---|---|---|---|
可读性 | 高 | 高 | 中 |
性能 | 差(循环中) | 中 | 优 |
内存效率 | 低 | 中 | 高 |
链式调用 | 支持 | 支持 | 支持 |
null处理 | 抛异常 | 转"null" | 转"null" |
适用场景 | 简单单次拼接 | 字面量/简单拼接 | 循环/复杂拼接 |
最佳实践指南:
- ✅ 简单拼接:1-2次操作 → 用
concat()
或+
- ⚠️ 循环拼接:绝对避免用
concat()
→ 改用StringBuilder
- 🆕 Java 8+:优先考虑
String.join()
或 Stream API - 🔒 空安全:拼接前检查 null 或使用 Optional
- 📏 超长字符串:>1KB 时始终用
StringBuilder
虽然
concat()
与+
在简单场景等效,但在现代Java开发中,StringBuilder
和String.join()
因更好的性能和内存特性已成为首选方案。