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)); // 每次创建新对象
}

使用技巧

  1. 简单场景替代+运算符

    // 等效写法
    String s1 = "Hello" + "World";
    String s2 = "Hello".concat("World");
    
  2. 链式拼接

    String version = "v"
         .concat("1")
         .concat(".")
         .concat("0");
    // "v1.0"
    
  3. 空值安全处理

    String safeConcat(String base, String addition) {
        return base.concat(addition == null ? "" : addition);
    }
    

常见错误与注意事项

  1. 忽略不可变性

    String original = "Hello";
    original.concat(" World"); // ❌ 原始字符串不变
    System.out.println(original); // 输出 "Hello"
    
  2. 循环拼接性能陷阱

    // 时间复杂度 O(n²)
    for (int i = 0; i < 10000; i++) {
        str = str.concat("x"); // 每次创建新字符串
    }
    
  3. null 参数处理

    String text = "Info: ";
    text.concat(getData()); // 若getData()返回null则崩溃
    

最佳实践与性能优化

  1. 优先使用 StringBuilder

    // 高效拼接(时间复杂度 O(n))
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < 10000; i++) {
        sb.append("x");
    }
    String result = sb.toString();
    
  2. 单行拼接选择依据: | 场景 | 推荐方式 | 原因 | |------|----------|------| | 字面量拼接 | "a" + "b" | 编译器优化为常量 | | 变量简单拼接 | str1 + str2 | 代码更简洁 | | 链式拼接 | concat() | 避免歧义 |

  3. 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"
    
  4. 性能对比: | 方法 | 1000次拼接耗时 | 内存占用 | |------|----------------|----------| | concat() | 15 ms | 高 (频繁创建对象) | | + 运算符 | 12 ms | 中等 | | StringBuilder | 0.5 ms | 低 (单对象操作) | | String.join() | 1 ms | 低 |


总结

特性 concat() + 运算符 StringBuilder
可读性
性能 差(循环中)
内存效率
链式调用 支持 支持 支持
null处理 抛异常 转"null" 转"null"
适用场景 简单单次拼接 字面量/简单拼接 循环/复杂拼接

最佳实践指南

  1. 简单拼接:1-2次操作 → 用 concat()+
  2. ⚠️ 循环拼接:绝对避免用 concat() → 改用 StringBuilder
  3. 🆕 Java 8+:优先考虑 String.join() 或 Stream API
  4. 🔒 空安全:拼接前检查 null 或使用 Optional
  5. 📏 超长字符串:>1KB 时始终用 StringBuilder

虽然 concat()+ 在简单场景等效,但在现代Java开发中,StringBuilderString.join() 因更好的性能和内存特性已成为首选方案。