Java 字符串拼接容器全解析(StringBuilder + StringJoiner + 所有同类工具,附区别 / 用法 / 选型)

10 阅读10分钟

一、先回顾:你已经学过的「老大」👉 StringBuilder

✅ 核心定位

最基础、最通用、最核心的可变字符串缓冲区,底层是「可变 char [] 字符数组」,是所有字符串拼接场景的基础

✅ 核心特点

  1. 本质是万能字符串操作工具:能追加、插入、删除、替换、反转字符串,功能最全;
  2. 拼接时无分隔符,默认直接拼接(比如拼接a,b,c要手动写append(a).append(",").append(b));
  3. 效率极致高,单线程首选,无任何多余功能,纯粹做字符串修改

✅ 必用核心方法(复习,重中之重)

java

运行

StringBuilder sb = new StringBuilder();
sb.append("张三");   // 追加任意内容(字符串、数字、对象都可以)
sb.append(",").append(20);
sb.insert(0, "姓名:"); // 指定位置插入
sb.delete(0,3); // 删除指定区间内容
sb.reverse();   // 反转字符串
String result = sb.toString(); // 最终转为String,固定步骤

✅ 你的作业常用场景

重写 toString 方法、拼接数组内容、循环拼接字符串、动态拼接司机 / 学生信息,万能适配


二、专门解决「带分隔符拼接」的神器 👉 StringJoiner (Java8+)

✅ 为什么会有 StringJoiner?—— 解决 StringBuilder 的痛点

StringBuilder 拼接带分隔符的字符串(比如 1,2,3张三|男|20语文,数学,英语)时,需要手动追加分隔符,代码繁琐还容易出错:

java

运行

// StringBuilder拼接带分隔符,麻烦!
StringBuilder sb = new StringBuilder();
double[] arr = {0.1,0.5,0.3};
for (int i = 0; i < arr.length; i++) {
    sb.append(arr[i]);
    if(i != arr.length-1){ // 还要判断是不是最后一个元素,避免多一个逗号
        sb.append(",");
    }
}

StringJoiner 就是为「带分隔符拼接」而生的,它是 Java8 专门推出的工具类,底层其实就是封装了 StringBuilder,帮我们封装了「分隔符、开头结尾字符」的逻辑,一行搞定带格式拼接,不用写任何判断!

✅ 核心定位

专注于「带分隔符的字符串拼接」,简化开发,属于「StringBuilder 的封装增强版」。

✅ 核心特点

  1. 创建对象时必须指定分隔符,天生支持「元素 + 分隔符」拼接,无需手动处理;
  2. 支持自定义前缀、后缀(超级好用!比如拼接成 [0.1, 0.5, 0.3] 格式);
  3. 自动处理「最后一个元素是否加分隔符」,永远不会出现1,2,3,这种多余逗号的情况;
  4. 方法少而精,只做「拼接」,不支持删除、反转、插入,功能专一。

✅ 完整用法(3 种场景,你的作业 100% 能用)

java

运行

import java.util.StringJoiner;

public class StringJoinerDemo {
    public static void main(String[] args) {
        // ========== 场景1:仅指定【分隔符】(最常用)==========
        StringJoiner sj1 = new StringJoiner(","); // 分隔符:逗号
        sj1.add("0.1").add("0.5").add("0.3");    // 逐个添加元素
        System.out.println(sj1); // 直接打印,无需toString() → 输出:0.1,0.5,0.3

        // ========== 场景2:指定【分隔符+前缀+后缀】(作业高频!)==========
        StringJoiner sj2 = new StringJoiner(",", "[", "]"); // 分隔符逗号,前缀[,后缀]
        sj2.add("张三").add("男").add("30");
        System.out.println(sj2); // 输出:[张三,男,30]

        // ========== 场景3:拼接数组内容(你的Math类/司机类直接用!)==========
        double[] arr = {0.1,0.5,0.3};
        StringJoiner sj3 = new StringJoiner(",");
        for (double num : arr) {
            sj3.add(String.valueOf(num)); // 数字转字符串添加
        }
        System.out.println("比较的数值:" + sj3); // 输出:比较的数值:0.1,0.5,0.3
    }
}

✅ 你的作业适配:重写司机类 toString 方法(完美替代 StringBuilder)

java

运行

@Override
public String toString() {
    StringJoiner sj = new StringJoiner("\n"); // 分隔符用换行符,完美排版
    sj.add("姓名:" + name);
    sj.add("性别:" + gender);
    sj.add("年龄:" + age);
    sj.add("驾驶证号:" + license);
    sj.add("车牌号:" + number);
    return sj.toString();
}

三、Java8 极简拼接工具 👉 String.join() (静态方法,超级好用!)

✅ 核心定位

String 类的静态方法,是 StringJoiner极简封装版,专门处理「简单的带分隔符拼接」,一行代码搞定,无需创建对象,开发中使用率最高

✅ 核心特点

  1. 属于java.lang.String无需导包,直接调用;
  2. 语法极致简洁,String.join(分隔符, 元素1, 元素2...)
  3. 支持「传入数组、集合」,批量拼接,不用写循环;
  4. 缺点:不支持自定义前缀后缀,功能比 StringJoiner 少,只做最基础的分隔拼接。

✅ 完整用法(4 种场景,必备!)

java

运行

public class StringJoinDemo {
    public static void main(String[] args) {
        // ========== 场景1:拼接多个字符串 ==========
        String str1 = String.join(",", "张三", "男", "30");
        System.out.println(str1); // 输出:张三,男,30

        // ========== 场景2:拼接数组(你的作业高频!)==========
        double[] arr = {0.1,0.5,0.3};
        // 数组需要先转成字符串数组,配合循环/流式处理
        String[] strArr = new String[arr.length];
        for (int i = 0; i < arr.length; i++) {
            strArr[i] = String.valueOf(arr[i]);
        }
        String str2 = String.join(",", strArr);
        System.out.println("数组拼接结果:" + str2); // 输出:0.1,0.5,0.3

        // ========== 场景3:拼接集合(后续学集合会用到)==========
        java.util.List<String> list = java.util.Arrays.asList("语文", "数学", "英语");
        String str3 = String.join("|", list);
        System.out.println(str3); // 输出:语文|数学|英语

        // ========== 场景4:你的Math类里直接用 ==========
        double a=0.1, b=0.5, c=0.3;
        System.out.println("参与比较的数值:"+String.join(",", String.valueOf(a),String.valueOf(b),String.valueOf(c)));
    }
}

四、和「拼接容器」用法逻辑相似的 👉 字符串切割容器

你问的是「类似的容器用法」,上面三个都是字符串拼接容器,Java 中还有一个和它们「同类型、同风格、同容器思想」的工具类:StringTokenizer(字符串切割器),它是字符串切割场景的容器,和拼接容器是「互补关系」,开发中经常一起用,必须一起学,性价比拉满!

✅ 核心定位

专门做字符串切割的容器,替代 String.split() 方法,效率更高、切割规则更灵活,底层是「字符匹配器」,用法和拼接容器一样,都是「创建对象 → 调用方法 → 获取结果」。

✅ 为什么不用 split ()?

split() 用的是正则表达式,切割简单字符串时「杀鸡用牛刀」,效率低;StringTokenizer 是原生字符匹配,效率极高,而且不会出现空字符串、索引越界的问题,适合切割「固定分隔符」的字符串(比如 张三,男,300.1|0.5|0.3)。

✅ 核心用法(和拼接容器完美互补)

java

运行

import java.util.StringTokenizer;

public class StringTokenizerDemo {
    public static void main(String[] args) {
        // 场景:切割用逗号分隔的字符串(拼接的逆操作)
        String str = "张三,男,30,京A12345,123456789";
        // 创建切割容器:参数1=要切割的字符串,参数2=分隔符
        StringTokenizer st = new StringTokenizer(str, ",");
        
        // 遍历容器,获取所有切割后的元素
        while(st.hasMoreTokens()){ // 判断是否还有下一个元素
            String token = st.nextToken(); // 获取下一个元素
            System.out.println(token);
        }
        /* 输出结果:
           张三
           男
           30
           京A12345
           123456789
        */
    }
}

五、拓展补充:2 个高频字符串格式化工具(和容器用法互补)

这两个不是「容器」,但是是 Java 中处理字符串的高频工具,和上面的拼接容器搭配使用,能解决你作业中「字符串格式化」的所有需求,比如:规范打印司机信息、规范打印数组比较结果,建议一起掌握!

✅ 1. String.format() 格式化字符串(Java5+,万能)

语法:String.format("格式化模板", 参数1, 参数2...),支持所有类型的格式化,比如数字、字符串、日期,重写 toString 方法的最优选择

java

运行

// 你的司机类toString方法用这个,排版更规范,代码更简洁
@Override
public String toString() {
    return String.format("姓名:%s\n性别:%s\n年龄:%d\n驾驶证号:%s\n车牌号:%s",
            name, gender, age, license, number);
}

✅ 2. String.formatted() 格式化字符串(Java16+,语法糖)

String.format()的简化版,写法更优雅,功能完全一样:

java

运行

String info = "姓名:%s,年龄:%d".formatted(name, age);

六、重中之重:所有字符串工具的【区别对比 + 选型建议】(必背,必考)

✅ 核心总结表(按你的学习优先级排序,⭐越多越常用)

工具类 / 方法核心作用核心特点优点缺点使用场景优先级⭐⭐⭐
StringBuilder字符串拼接 / 修改可变字符数组,万能操作功能最全、效率最高、无限制拼接分隔符需手动处理所有需要「修改字符串」的场景:追加、插入、删除、反转、循环拼接、toString 重写⭐⭐⭐⭐⭐(必学必用)
StringJoiner带分隔符拼接封装 StringBuilder,天生带分隔符自动处理分隔符,支持前后缀,代码简洁功能单一,仅支持拼接固定格式拼接:数组内容打印、带分隔符的字符串拼接、有序列表⭐⭐⭐⭐⭐(必学必用)
String.join()极简分隔拼接String 静态方法,无需创建对象语法极致简洁,无需导包,支持数组 / 集合不支持前后缀,功能简单简单的分隔拼接,快速开发,临时打印⭐⭐⭐⭐⭐(必学必用)
StringTokenizer字符串切割原生字符匹配,切割效率高无空字符串、无正则开销、效率高只支持固定分隔符切割固定分隔符的字符串,比如拼接后的结果逆解析⭐⭐⭐⭐(必学)
String.format()字符串格式化模板化输出,规范排版排版美观,支持所有类型格式化不适合大量拼接规范打印对象信息、重写 toString、固定模板输出⭐⭐⭐⭐(必学)
String字符串存储不可变字符串语法简单,适合固定内容拼接效率极低,创建大量对象字符串内容固定不变时(比如常量、少量拼接)⭐⭐⭐⭐⭐(基础)

✅ 核心选型口诀(看完直接会选,永不踩坑)

  1. 只要需要修改字符串(追加、插入、删除)→ 无脑用 StringBuilder
  2. 只要是带分隔符拼接 → 优先用 String.join ()(简单场景)/ StringJoiner(带前后缀)
  3. 只要是切割字符串 → 优先用 StringTokenizer(固定分隔符)/split ()(正则切割)
  4. 只要是规范打印信息 → 优先用 String.format ()

七、你的作业实战整合:用今天学的所有工具优化之前的代码

✅ 优化 1:MyMath 类(拼接数组内容 + 打印比较结果)

java

运行

package com.shehuiuniversity;
public class MyMath {
    public void add(int a, int b) {
        // String.format() 格式化打印
        System.out.println(String.format("%d + %d = %d", a, b, a+b));
    }
    public void compare(double a, double b,double c) {
        double [] arr = {a,b,c};
        // String.join() 极简拼接数组内容
        String nums = String.join(",", String.valueOf(a),String.valueOf(b),String.valueOf(c));
        System.out.println("参与比较的数值:" + nums);
        
        double temp = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if (temp < arr[i]) {
                temp = arr[i];
            }
        }
        System.out.println("最大值为:"+temp);
    }
}

✅ 优化 2:CarDriver 类(toString 用 StringJoiner 重写)

java

运行

package com.shehuiuniversity;
import java.util.Scanner;
import java.util.StringJoiner;
public class CarDriver {
    private String name;
    private String gender;
    private int age;
    private String license;
    private String number;

    public void setName(){
        System.out.println("请输入司机姓名");
        Scanner sc = new Scanner(System.in);
        name = sc.nextLine();
    }
    public void setGender(){
        System.out.println("键入司机性别");
        Scanner sc = new Scanner(System.in);
        gender = sc.nextLine();
    }
    public void setAge(){
        System.out.println("键入司机年龄");
        Scanner sc = new Scanner(System.in);
        age = sc.nextInt();
        sc.nextLine();
    }
    public void setLicense(){
        System.out.println("键入司机驾驶证号");
        Scanner sc = new Scanner(System.in);
        license = sc.nextLine();
    }
    public void setNumber(){
        System.out.println("键入车牌号");
        Scanner sc = new Scanner(System.in);
        number = sc.nextLine();
    }
    public void wayToDrive(){
        System.out.println(name+"司机正在开号码为"+number+"的🚗");
    }
    
    // 用StringJoiner重写toString,排版更整洁
    @Override
    public String toString() {
        StringJoiner sj = new StringJoiner("\n", "【汽车司机完整信息】\n", "");
        sj.add("姓名:" + name);
        sj.add("性别:" + gender);
        sj.add("年龄:" + age);
        sj.add("驾驶证号:" + license);
        sj.add("车牌号:" + number);
        return sj.toString();
    }
}

✅ 测试类调用

java

运行

package com.Testclass;
import com.shehuiuniversity.MyMath;
import com.shehuiuniversity.CarDriver;
public class TestAll {
    public static void main(String[] args) {
        MyMath math = new MyMath();
        math.compare(0.1,0.5,0.3);
        math.add(10,20);
        
        CarDriver driver = new CarDriver();
        driver.setName();
        driver.setGender();
        driver.setAge();
        driver.setLicense();
        driver.setNumber();
        System.out.println(driver); // 直接打印,自动调用toString
    }
}

八、最终总结(精华版,全部考点)

  1. Java 中处理字符串的核心工具分为三类:拼接容器(StringBuilder/StringJoiner/String.join ())切割容器(StringTokenizer)格式化工具(String.format ())
  2. StringBuilder 是基础,功能最全,所有拼接场景都能兜底;StringJoiner 和 String.join () 是简化版,专门解决分隔拼接;
  3. 所有工具的底层都是「字符数组」,只是 Java 帮我们封装了不同的功能,本质都是为了提高效率、简化代码
  4. 你的作业中,toString 重写、数组内容打印、字符串拼接是高频场景,用今天学的工具能让代码更简洁、更规范、效率更高。