源本科技 | 码上会

Java 字符串 concat 方法

2025/12/26
23
0

学习目标

  • 掌握 String.concat() 方法的基本语法与使用方式

  • 理解其与 + 操作符在字符串拼接中的区别

  • 能够处理 NullPointerException 异常场景

  • 了解 concat() 在实际编程(如字符串反转)中的应用


方法简介

concat()String 类的一个实例方法,用于将一个字符串追加到当前字符串的末尾,并返回一个新的拼接后的字符串。

⚠️ 注意:由于 String 是不可变的,concat() 不会修改原字符串,而是创建并返回一个新对象

语法

public String concat(String str)

参数

  • str:要追加到当前字符串末尾的字符串(不能为 null

返回值

  • 拼接后的新字符串(this + str

异常

  • NullPointerException:当传入的参数 strnull 时抛出


基础示例

基本拼接

public class CoderHub {
    public static void main(String[] args) {
        String s = "Code";
        s = s.concat("Master"); // 必须重新赋值才能保留结果
        System.out.println(s);  // 输出:CodeMaster
    }
}

🔔 关键点:若不将返回值赋给变量,拼接结果会丢失!


拼接两个字符串

String prefix = "Data";
String suffix = "Structure";
String result = prefix.concat(suffix);
System.out.println(result); // DataStructure

连续拼接多个字符串

public class CoderHub {
    public static void main(String[] args) {
        String part1 = "Web-";
        String part2 = "Development-";
        String part3 = "Guide";

        String temp = part1.concat(part2);      // Web-Development-
        String full = temp.concat(part3);       // Web-Development-Guide

        System.out.println(full);
    }
}

输出

Web-Development-Guide

💡 提示:虽然可以链式调用(如 s1.concat(s2).concat(s3)),但可读性较差,建议分步或使用 StringBuilder


异常处理

如果传入 null 作为参数,concat() 会抛出 NullPointerException

错误示例

public class CoderHub {
    public static void main(String[] args) {
        String a = "Hello";
        String b = null;
        String c = a.concat(b); // ❌ 抛出 NullPointerException
    }
}

运行结果

Exception in thread "main" java.lang.NullPointerException

安全写法

String safeConcat(String base, String append) {
    if (append == null) {
        return base; // 或 return base + "null"; 视需求而定
    }
    return base.concat(append);
}

最佳实践:在不确定参数是否为 null 时,优先使用 + 操作符或 Objects.toString() 配合 StringBuilder


与 + 操作符对比

特性

concat()

+ 操作符

参数类型

仅接受 String

可接受任意类型(自动转为字符串)

null 处理

抛出异常

自动转为 "null" 字符串

性能(少量拼接)

略快(直接操作)

略慢(编译器转为 StringBuilder

可读性

较低(需方法调用)

高(直观)

String name = "Alice";
String score = null;

// 使用 +
System.out.println(name + score); // Alicenull

// 使用 concat()
// System.out.println(name.concat(score)); // ❌ 报错!

📌 建议

  • 已知非空且追求微性能 → 用 concat()

  • 通用场景、含可能 null 值 → 用 +StringBuilder


实战应用:反转字符串

虽然不推荐(效率低),但可通过 concat() 实现字符串反转,加深对字符串不可变性的理解。

public class ReverseString {
    public static void main(String[] args) {
        String original = "Coder";
        String reversed = "";

        // 从后往前遍历每个字符
        for (int i = original.length() - 1; i >= 0; i--) {
            char ch = original.charAt(i);
            String charStr = Character.toString(ch);
            reversed = reversed.concat(charStr); // 每次创建新字符串!
        }

        System.out.println("Original: " + original);
        System.out.println("Reversed: " + reversed);
    }
}

输出

Original: Coder
Reversed: redoC

⚠️ 性能警告:此方法时间复杂度为 O(n²),因每次 concat() 都复制整个字符串。

高效替代方案:使用 StringBuilder.reverse()


适用场景

何时使用?

  • 拼接两个已知非空的字符串

  • 代码风格要求避免 +(如某些编码规范)

  • 微优化场景(但收益极小)

何时避免?

  • 拼接超过两个字符串

  • 循环中拼接(应使用 StringBuilder

  • 参数可能为 null

推荐替代方案

// 单线程动态拼接
StringBuilder sb = new StringBuilder();
sb.append("A").append("B").append("C");
String result = sb.toString();

// 多字符串格式化
String msg = String.format("%s-%s-%d", "User", "Login", 2025);

重点总结

  • concat()安全、明确的两字符串拼接方法

  • 不改变原字符串,必须接收返回值

  • 不接受 null,否则抛出 NullPointerException

  • 简单、确定非空的场景下可用,但不适用于复杂拼接

  • 理解其底层机制有助于深入掌握 Java 字符串的不可变特性


思考题

  1. 为什么 concat() 方法只接受 String 类型参数,而 + 操作符可以拼接任意类型?

  2. 在以下代码中,共创建了多少个字符串对象?

    String s = "A";
    s = s.concat("B");
    s = s.concat("C");
  3. 如果你需要拼接一个用户列表(如 "user1, user2, user3"),使用 concat() 是否合适?请说明理由并给出更优方案。