一、为什么要学stringbuilder?先搞懂核心痛点
java 中的 string 字符串是【不可变】的 !
不可变:指一个
string对象一旦创建,它的内容(字符)就永远不能修改。
比如我们写字符串拼接:
运行
string str = "a"; str = str + "b"; str = str + "c";
看似是给str追加了内容,实际底层逻辑:
- 先创建
"a"对象 → 拼接"b"时,创建新对象"ab"→ 拼接"c"时,再创建新对象"abc" - 原来的
"a"、"ab"会变成垃圾数据,占用内存 + 降低效率
👉 痛点总结:如果频繁拼接、修改字符串(比如循环拼接、拼接大量内容),用string会产生大量无用对象,效率极低、浪费内存。
而 stringbuilder 就是为了解决这个问题而生的,它的核心特点是:字符串可变容器,增删改查都在「同一个对象」里操作,无额外内存浪费,效率极高。
二、stringbuilder核心概念
1. 本质
stringbuilder 是 java 提供的一个字符串缓冲区类,底层是一个可变的字符数组,专门用于高效拼接、修改字符串内容。
- 所有字符串的修改操作,都是直接在这个字符数组上完成,不会创建新对象
- 我们之前手写的
char[]字符数组,其实就是stringbuilder的底层原理,stringbuilder是 java 帮我们封装好的「好用的字符数组工具类」
2. 核心特点
- 可变的:内容可以随时追加、插入、删除、替换,核心优势!
- 效率极高:所有操作都在一个对象内完成,无内存浪费
- 线程不安全:单线程编程(咱们平时写的
main方法、普通业务代码)中使用,速度更快 - 无 final 修饰:可以被继承、重写方法(实际开发几乎不用)
三、stringbuilder基础用法(必学,固定格式)
第一步:创建stringbuilder对象
两种常用创建方式,都是无参 / 有参构造,任选其一:
// 方式1:无参构造(推荐),创建一个空的字符串缓冲区,初始容量默认16个字符
stringbuilder sb = new stringbuilder();
// 方式2:有参构造,创建时直接放入初始字符串
stringbuilder sb = new stringbuilder("初始内容");
第二步:核心操作(拼接 / 修改字符串)
stringbuilder 提供了一系列方法来操作字符串,所有方法调用后,都是直接修改自身对象,不需要接收返回值,这是和string最大的区别!
重点必学的 5 个核心方法(覆盖 99% 的开发场景)
所有方法我都给了代码示例,直接复制就能运行,建议跟着敲一遍!
public class stringbuilderdemo {
public static void main(string[] args) {
// 1. 创建对象
stringbuilder sb = new stringbuilder();
// ========== 方法1:append(任意类型) 追加内容【最常用】 ==========
// 可以追加:字符串、字符、数字、布尔值、数组...所有类型都支持
sb.append("姓名:");
sb.append("张三");
sb.append(",年龄:");
sb.append(20);
sb.append(",是否有驾照:");
sb.append(true);
// 此时sb的内容:姓名:张三,年龄:20,是否有驾照:true
// ========== 方法2:tostring() 转换为string类型【必须会】 ==========
// 注意:stringbuilder不是string类型,无法直接赋值给string变量
// 所有操作完成后,用tostring()转为string,才能正常使用字符串
string result = sb.tostring();
system.out.println(result); // 输出:姓名:张三,年龄:20,是否有驾照:true
// ========== 方法3:insert(索引, 内容) 插入内容 ==========
// 在指定索引位置插入内容,原位置的字符会向后移
sb.insert(4, "(司机)");
system.out.println(sb); // 输出:姓名:张三(司机),年龄:20,是否有驾照:true
// ========== 方法4:delete(起始索引, 结束索引) 删除内容 ==========
// 左闭右开:包含起始索引,不包含结束索引
sb.delete(4,8); // 删除 (司机) 这几个字
system.out.println(sb); // 输出:姓名:张三,年龄:20,是否有驾照:true
// ========== 方法5:reverse() 反转字符串 ==========
sb.reverse();
system.out.println(sb); // 输出:eurt:照驾有否是,02:龄年,三张:名姓
}
}
补充 3 个常用小方法(锦上添花)
stringbuilder sb = new stringbuilder("java学习");
sb.replace(0,4,"python"); // 替换:索引0-4的内容换成python → 结果:python学习
sb.length(); // 获取长度 → 6
sb.charat(2); // 获取指定索引的字符 → t
四、stringbuildervsstring核心对比(必考 + 必懂)
这是 java 基础面试高频题,也是咱们写代码的核心选择依据,一张表讲清所有区别,建议牢记:
| 特性 | string 字符串 | stringbuilder 字符串缓冲区 |
|---|---|---|
| 可变性 | ✅ 不可变(内容不能改) | ✅ 可变(内容随便改) |
| 内存效率 | ❌ 低,拼接创建新对象 | ✅ 极高,修改不创建新对象 |
| 拼接方式 | 用 + 号拼接 | 用 append() 方法拼接 |
| 核心场景 | 字符串内容固定不变时使用(比如定义常量、少量拼接) | 字符串需要频繁拼接 / 修改时使用(比如循环拼接、动态拼接内容) |
| 转换关系 | string → stringbuilder:new stringbuilder(str) | stringbuilder → string:sb.tostring() |
经典对比案例(你的代码能用到)
比如拼接 1-100 的数字,两种方式的效率天差地别:
// 1. string拼接 → 效率极低,创建大量垃圾对象
string str = "";
for (int i = 1; i <= 100; i++) {
str += i;
}
// 2. stringbuilder拼接 → 效率极高,仅一个对象
stringbuilder sb = new stringbuilder();
for (int i = 1; i <= 100; i++) {
sb.append(i);
}
string result = sb.tostring();
五、stringbuilder实战案例(贴合你的代码场景)
结合你之前写的【汽车司机类】【数值比较类】,给你 2 个你能直接用到作业里的实战案例,学完就会用!
案例 1:拼接司机信息(替换你之前的 tostring 方法)
你之前写的cardriver类里,tostring 方法是手动拼接字符串,用stringbuilder更高效,推荐这么写:
// 司机类的tostring方法优化(推荐写法)
@override
public string tostring() {
stringbuilder sb = new stringbuilder();
sb.append("汽车司机信息:");
sb.append("\n姓名:").append(name);
sb.append("\n性别:").append(gender);
sb.append("\n年龄:").append(age);
sb.append("\n驾驶证号:").append(license);
sb.append("\n车牌号:").append(number);
return sb.tostring();
}
案例 2:拼接数组内容(你之前写的数值比较类里的数组)
你之前写了double[] arr = {a,b,c},用stringbuilder可以快速把数组内容拼接成字符串打印,非常实用:
public void compare(double a, double b, double c) {
double [] arr = {a,b,c};
// 用stringbuilder拼接数组内容
stringbuilder sb = new stringbuilder("比较的三个数:");
for (int i = 0; i < arr.length; i++) {
sb.append(arr[i]).append(" ");
}
system.out.println(sb); // 输出:比较的三个数:0.1 0.1 0.1
double temp = arr[0];
for (int i = 1; i < arr.length; i++) {
if (temp < arr[i]) {
temp = arr[i];
}
}
system.out.println("最大值为:"+temp);
}
六、拓展补充:stringbuilder和stringbuffer
这两个类用法完全一样,99% 的方法都是同名的,唯一区别:
stringbuilder:线程不安全,效率更高 → 单线程用它(咱们所有作业 / 练习都用这个)stringbuffer:线程安全,效率稍低 → 多线程开发时使用(暂时不用学)
一句话总结:日常写代码,无脑用stringbuilder就对了!
七、所有知识点总结(精华版,必背)
string不可变,拼接多了效率低;stringbuilder可变,专门解决字符串频繁修改 / 拼接的问题。stringbuilder底层是可变字符数组,所有操作都在自身对象完成,无内存浪费。- 核心三步:创建对象 → append () 拼接 → tostring () 转 string。
- 核心方法:
append()(追加)、tostring()(转换)、insert()(插入)、delete()(删除)、reverse()(反转)。 - 使用场景:只要你需要拼接字符串、修改字符串内容,就用
stringbuilder;字符串固定不变,就用string。
附赠:你之前报错的 math 类代码 + stringbuilder 优化版
把你之前的代码整合优化,加入 stringbuilder,直接复制可用:
// com.shehuiuniversity.mymath.java
package com.shehuiuniversity;
public class mymath {
public void add(int a, int b) {
int add = a + b;
system.out.println(a + " + " + b + " = " + add);
}
public void compare(double a, double b,double c) {
double [] arr = {a,b,c};
stringbuilder sb = new stringbuilder();
sb.append("参与比较的数值:").append(a).append(",").append(b).append(",").append(c);
system.out.println(sb);
double temp = arr[0];
for (int i = 1; i < arr.length; i++) {
if (temp < arr[i]) {
temp = arr[i];
}
}
system.out.println("最大值为:"+temp);
}
}
// com.testclass.mathtest.java
package com.testclass;
import com.shehuiuniversity.mymath;
public class mathtest {
public static void main(string[] args) {
mymath ma = new mymath();
ma.compare(0.1,0.5,0.3); // 正确调用,无报错
ma.add(10,20);
}
}
运行结果:
plaintext
参与比较的数值:0.1,0.5,0.3 最大值为:0.5 10 + 20 = 30
总结
到此这篇关于java中stringbuilder的文章就介绍到这了,更多相关java中stringbuilder讲解内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论