一、先回顾:你已经学过的「老大」👉 StringBuilder
✅ 核心定位
最基础、最通用、最核心的可变字符串缓冲区,底层是「可变 char [] 字符数组」,是所有字符串拼接场景的基础。
✅ 核心特点
- 本质是万能字符串操作工具:能追加、插入、删除、替换、反转字符串,功能最全;
- 拼接时无分隔符,默认直接拼接(比如拼接
a,b,c要手动写append(a).append(",").append(b)); - 效率极致高,单线程首选,无任何多余功能,纯粹做字符串修改;
✅ 必用核心方法(复习,重中之重)
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 的封装增强版」。
✅ 核心特点
- 创建对象时必须指定分隔符,天生支持「元素 + 分隔符」拼接,无需手动处理;
- 支持自定义前缀、后缀(超级好用!比如拼接成
[0.1, 0.5, 0.3]格式); - 自动处理「最后一个元素是否加分隔符」,永远不会出现
1,2,3,这种多余逗号的情况; - 方法少而精,只做「拼接」,不支持删除、反转、插入,功能专一。
✅ 完整用法(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 的极简封装版,专门处理「简单的带分隔符拼接」,一行代码搞定,无需创建对象,开发中使用率最高!
✅ 核心特点
- 属于
java.lang.String,无需导包,直接调用; - 语法极致简洁,
String.join(分隔符, 元素1, 元素2...); - 支持「传入数组、集合」,批量拼接,不用写循环;
- 缺点:不支持自定义前缀后缀,功能比 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 是原生字符匹配,效率极高,而且不会出现空字符串、索引越界的问题,适合切割「固定分隔符」的字符串(比如 张三,男,30、0.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 | 字符串存储 | 不可变字符串 | 语法简单,适合固定内容 | 拼接效率极低,创建大量对象 | 字符串内容固定不变时(比如常量、少量拼接) | ⭐⭐⭐⭐⭐(基础) |
✅ 核心选型口诀(看完直接会选,永不踩坑)
- 只要需要修改字符串(追加、插入、删除)→ 无脑用 StringBuilder;
- 只要是带分隔符拼接 → 优先用 String.join ()(简单场景)/ StringJoiner(带前后缀) ;
- 只要是切割字符串 → 优先用 StringTokenizer(固定分隔符)/split ()(正则切割) ;
- 只要是规范打印信息 → 优先用 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
}
}
八、最终总结(精华版,全部考点)
- Java 中处理字符串的核心工具分为三类:拼接容器(StringBuilder/StringJoiner/String.join ()) 、切割容器(StringTokenizer) 、格式化工具(String.format ()) ;
- StringBuilder 是基础,功能最全,所有拼接场景都能兜底;StringJoiner 和 String.join () 是简化版,专门解决分隔拼接;
- 所有工具的底层都是「字符数组」,只是 Java 帮我们封装了不同的功能,本质都是为了提高效率、简化代码;
- 你的作业中,toString 重写、数组内容打印、字符串拼接是高频场景,用今天学的工具能让代码更简洁、更规范、效率更高。