Java中StringBuilder超詳細(xì)講解(附實例代碼)
一、為什么要學(xué)StringBuilder?先搞懂核心痛點
Java 中的 String 字符串是【不可變】的 !
不可變:指一個
String對象一旦創(chuàng)建,它的內(nèi)容(字符)就永遠(yuǎn)不能修改。
比如我們寫字符串拼接:
運(yùn)行
String str = "a"; str = str + "b"; str = str + "c";
看似是給str追加了內(nèi)容,實際底層邏輯:
- 先創(chuàng)建
"a"對象 → 拼接"b"時,創(chuàng)建新對象"ab"→ 拼接"c"時,再創(chuàng)建新對象"abc" - 原來的
"a"、"ab"會變成垃圾數(shù)據(jù),占用內(nèi)存 + 降低效率
?? 痛點總結(jié):如果頻繁拼接、修改字符串(比如循環(huán)拼接、拼接大量內(nèi)容),用String會產(chǎn)生大量無用對象,效率極低、浪費內(nèi)存。
而 StringBuilder 就是為了解決這個問題而生的,它的核心特點是:字符串可變?nèi)萜?,增刪改查都在「同一個對象」里操作,無額外內(nèi)存浪費,效率極高。
二、StringBuilder核心概念
1. 本質(zhì)
StringBuilder 是 Java 提供的一個字符串緩沖區(qū)類,底層是一個可變的字符數(shù)組,專門用于高效拼接、修改字符串內(nèi)容。
- 所有字符串的修改操作,都是直接在這個字符數(shù)組上完成,不會創(chuàng)建新對象
- 我們之前手寫的
char[]字符數(shù)組,其實就是StringBuilder的底層原理,StringBuilder是 Java 幫我們封裝好的「好用的字符數(shù)組工具類」
2. 核心特點
- 可變的:內(nèi)容可以隨時追加、插入、刪除、替換,核心優(yōu)勢!
- 效率極高:所有操作都在一個對象內(nèi)完成,無內(nèi)存浪費
- 線程不安全:單線程編程(咱們平時寫的
main方法、普通業(yè)務(wù)代碼)中使用,速度更快 - 無 final 修飾:可以被繼承、重寫方法(實際開發(fā)幾乎不用)
三、StringBuilder基礎(chǔ)用法(必學(xué),固定格式)
第一步:創(chuàng)建StringBuilder對象
兩種常用創(chuàng)建方式,都是無參 / 有參構(gòu)造,任選其一:
// 方式1:無參構(gòu)造(推薦),創(chuàng)建一個空的字符串緩沖區(qū),初始容量默認(rèn)16個字符
StringBuilder sb = new StringBuilder();
// 方式2:有參構(gòu)造,創(chuàng)建時直接放入初始字符串
StringBuilder sb = new StringBuilder("初始內(nèi)容");
第二步:核心操作(拼接 / 修改字符串)
StringBuilder 提供了一系列方法來操作字符串,所有方法調(diào)用后,都是直接修改自身對象,不需要接收返回值,這是和String最大的區(qū)別!
重點必學(xué)的 5 個核心方法(覆蓋 99% 的開發(fā)場景)
所有方法我都給了代碼示例,直接復(fù)制就能運(yùn)行,建議跟著敲一遍!
public class StringBuilderDemo {
public static void main(String[] args) {
// 1. 創(chuàng)建對象
StringBuilder sb = new StringBuilder();
// ========== 方法1:append(任意類型) 追加內(nèi)容【最常用】 ==========
// 可以追加:字符串、字符、數(shù)字、布爾值、數(shù)組...所有類型都支持
sb.append("姓名:");
sb.append("張三");
sb.append(",年齡:");
sb.append(20);
sb.append(",是否有駕照:");
sb.append(true);
// 此時sb的內(nèi)容:姓名:張三,年齡:20,是否有駕照:true
// ========== 方法2:toString() 轉(zhuǎn)換為String類型【必須會】 ==========
// 注意:StringBuilder不是String類型,無法直接賦值給String變量
// 所有操作完成后,用toString()轉(zhuǎn)為String,才能正常使用字符串
String result = sb.toString();
System.out.println(result); // 輸出:姓名:張三,年齡:20,是否有駕照:true
// ========== 方法3:insert(索引, 內(nèi)容) 插入內(nèi)容 ==========
// 在指定索引位置插入內(nèi)容,原位置的字符會向后移
sb.insert(4, "(司機(jī))");
System.out.println(sb); // 輸出:姓名:張三(司機(jī)),年齡:20,是否有駕照:true
// ========== 方法4:delete(起始索引, 結(jié)束索引) 刪除內(nèi)容 ==========
// 左閉右開:包含起始索引,不包含結(jié)束索引
sb.delete(4,8); // 刪除 (司機(jī)) 這幾個字
System.out.println(sb); // 輸出:姓名:張三,年齡:20,是否有駕照:true
// ========== 方法5:reverse() 反轉(zhuǎn)字符串 ==========
sb.reverse();
System.out.println(sb); // 輸出:eurT:照駕有否是,02:齡年,三張:名姓
}
}
補(bǔ)充 3 個常用小方法(錦上添花)
StringBuilder sb = new StringBuilder("Java學(xué)習(xí)");
sb.replace(0,4,"Python"); // 替換:索引0-4的內(nèi)容換成Python → 結(jié)果:Python學(xué)習(xí)
sb.length(); // 獲取長度 → 6
sb.charAt(2); // 獲取指定索引的字符 → t
四、StringBuildervsString核心對比(必考 + 必懂)
這是 Java 基礎(chǔ)面試高頻題,也是咱們寫代碼的核心選擇依據(jù),一張表講清所有區(qū)別,建議牢記:
| 特性 | String 字符串 | StringBuilder 字符串緩沖區(qū) |
|---|---|---|
| 可變性 | ? 不可變(內(nèi)容不能改) | ? 可變(內(nèi)容隨便改) |
| 內(nèi)存效率 | ? 低,拼接創(chuàng)建新對象 | ? 極高,修改不創(chuàng)建新對象 |
| 拼接方式 | 用 + 號拼接 | 用 append() 方法拼接 |
| 核心場景 | 字符串內(nèi)容固定不變時使用(比如定義常量、少量拼接) | 字符串需要頻繁拼接 / 修改時使用(比如循環(huán)拼接、動態(tài)拼接內(nèi)容) |
| 轉(zhuǎn)換關(guān)系 | String → StringBuilder:new StringBuilder(str) | StringBuilder → String:sb.toString() |
經(jīng)典對比案例(你的代碼能用到)
比如拼接 1-100 的數(shù)字,兩種方式的效率天差地別:
// 1. String拼接 → 效率極低,創(chuàng)建大量垃圾對象
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實戰(zhàn)案例(貼合你的代碼場景)
結(jié)合你之前寫的【汽車司機(jī)類】【數(shù)值比較類】,給你 2 個你能直接用到作業(yè)里的實戰(zhàn)案例,學(xué)完就會用!
案例 1:拼接司機(jī)信息(替換你之前的 toString 方法)
你之前寫的CarDriver類里,toString 方法是手動拼接字符串,用StringBuilder更高效,推薦這么寫:
// 司機(jī)類的toString方法優(yōu)化(推薦寫法)
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("汽車司機(jī)信息:");
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:拼接數(shù)組內(nèi)容(你之前寫的數(shù)值比較類里的數(shù)組)
你之前寫了double[] arr = {a,b,c},用StringBuilder可以快速把數(shù)組內(nèi)容拼接成字符串打印,非常實用:
public void compare(double a, double b, double c) {
double [] arr = {a,b,c};
// 用StringBuilder拼接數(shù)組內(nèi)容
StringBuilder sb = new StringBuilder("比較的三個數(shù):");
for (int i = 0; i < arr.length; i++) {
sb.append(arr[i]).append(" ");
}
System.out.println(sb); // 輸出:比較的三個數(shù):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);
}
六、拓展補(bǔ)充:StringBuilder和StringBuffer
這兩個類用法完全一樣,99% 的方法都是同名的,唯一區(qū)別:
StringBuilder:線程不安全,效率更高 → 單線程用它(咱們所有作業(yè) / 練習(xí)都用這個)StringBuffer:線程安全,效率稍低 → 多線程開發(fā)時使用(暫時不用學(xué))
一句話總結(jié):日常寫代碼,無腦用StringBuilder就對了!
七、所有知識點總結(jié)(精華版,必背)
String不可變,拼接多了效率低;StringBuilder可變,專門解決字符串頻繁修改 / 拼接的問題。StringBuilder底層是可變字符數(shù)組,所有操作都在自身對象完成,無內(nèi)存浪費。- 核心三步:創(chuàng)建對象 → append () 拼接 → toString () 轉(zhuǎn) String。
- 核心方法:
append()(追加)、toString()(轉(zhuǎn)換)、insert()(插入)、delete()(刪除)、reverse()(反轉(zhuǎn))。 - 使用場景:只要你需要拼接字符串、修改字符串內(nèi)容,就用
StringBuilder;字符串固定不變,就用String。
附贈:你之前報錯的 Math 類代碼 + StringBuilder 優(yōu)化版
把你之前的代碼整合優(yōu)化,加入 StringBuilder,直接復(fù)制可用:
// 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("參與比較的數(shù)值:").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); // 正確調(diào)用,無報錯
ma.add(10,20);
}
}
運(yùn)行結(jié)果:
plaintext
參與比較的數(shù)值:0.1,0.5,0.3 最大值為:0.5 10 + 20 = 30
總結(jié)
到此這篇關(guān)于Java中StringBuilder的文章就介紹到這了,更多相關(guān)Java中StringBuilder講解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在idea2023中使用SpringBoot整合Lombok全過程及詳細(xì)用法
Lombok項目是一個java庫,它可以自動插入到編輯器和構(gòu)建工具中,增強(qiáng)java的性能,本文詳細(xì)給大家介紹了在idea2023中使用SpringBoot整合Lombok全過程及詳細(xì)用法,需要的朋友可以參考下2023-09-09
Java數(shù)據(jù)結(jié)構(gòu)之棧與綜合計算器的實現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Java數(shù)據(jù)結(jié)構(gòu)中棧與綜合計算器的實現(xiàn),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以了解一下2022-10-10
Java實現(xiàn)Word/Excel/TXT轉(zhuǎn)PDF的方法
這篇文章主要介紹了Java實現(xiàn)Word/Excel/TXT轉(zhuǎn)PDF的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2020-01-01
java中synchronized關(guān)鍵字的3種寫法實例
synchronized是Java中的關(guān)鍵字,是一種同步鎖,下面這篇文章主要給大家介紹了關(guān)于java中synchronized關(guān)鍵字的3種寫法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-11-11
spring cloud升級到spring boot 2.x/Finchley.RELEASE遇到的坑
這篇文章主要介紹了spring cloud升級到spring boot 2.x/Finchley.RELEASE遇到的坑,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-08-08

