java学习--StringBuilder

Java 中的 StringBuilder,它是 Java 中用于高效处理可变字符串 的核心类,主要解决了 String 类不可变导致的字符串拼接效率低下问题,下面从核心特性、常用操作、使用示例等方面全面讲解:

一、核心特性

  1. 可变字符序列StringBuilder 的底层是一个可扩容的字符数组(char[]),修改操作(拼接、插入、删除等)直接在原有数组上进行,不会创建新的字符串对象,这是它与 String 类的核心区别(String 是不可变的,修改会产生新对象)。
  2. 非线程安全StringBuilder 没有提供线程同步机制,在多线程环境下并发修改可能会导致数据不一致,效率相对较高。
  3. 高效性能 :由于避免了频繁创建字符串对象和内存拷贝,在大量字符串拼接、修改场景下,性能远优于 String 类和线程安全的 StringBufferStringBufferStringBuilder 的线程安全版本,性能略低)。
  4. 初始容量与扩容机制
    • 默认初始容量为 16 个字符;
    • 也可通过构造方法 new StringBuilder(int capacity) 指定初始容量;
    • 当字符数量超过当前容量时,会自动扩容,扩容规则为 新容量 = 旧容量 * 2 + 2,扩容时会进行数组拷贝,因此指定合适的初始容量可减少扩容次数,进一步提升性能。

二、常用构造方法

构造方法 说明
StringBuilder() 创建一个空的 StringBuilder,初始容量为 16
StringBuilder(int capacity) 创建一个空的 StringBuilder,指定初始容量
StringBuilder(String str) 创建一个包含指定字符串的 StringBuilder,初始容量为 16 + str.length()

示例:

复制代码
// 1. 默认构造
StringBuilder sb1 = new StringBuilder();
// 2. 指定初始容量
StringBuilder sb2 = new StringBuilder(50);
// 3. 基于已有字符串创建
StringBuilder sb3 = new StringBuilder("Hello");

三、核心常用方法

1. 字符串拼接:append(...)

用于将任意类型数据(字符串、基本类型、对象等)拼接到 StringBuilder 的末尾,返回自身对象(支持链式调用)。

复制代码
StringBuilder sb = new StringBuilder("Java");
// 拼接字符串
sb.append(" ");
sb.append("StringBuilder");
// 链式调用拼接基本类型
sb.append(" - 版本:").append(1.8).append(" - 长度:").append(sb.length());
System.out.println(sb); // 输出:Java StringBuilder - 版本:1.8 - 长度:32

2. 字符串反转:reverse()

StringBuilder 中的字符序列反转,返回自身对象(支持链式调用)。

复制代码
StringBuilder sb = new StringBuilder("Hello World");
sb.reverse();
System.out.println(sb); // 输出:dlroW olleH

3. 插入操作:insert(int offset, ...)

在指定索引位置(offset)插入任意类型数据,索引从 0 开始,返回自身对象(支持链式调用)。

复制代码
StringBuilder sb = new StringBuilder("Hello World");
// 在索引 5 的位置插入逗号和空格
sb.insert(5, ", ");
System.out.println(sb); // 输出:Hello, World
// 插入多个数据
sb.insert(0, "Java: ").insert(sb.length(), "!");
System.out.println(sb); // 输出:Java: Hello, World!

4. 删除操作:delete(int start, int end)

删除从 start 索引(包含)到 end 索引(不包含)之间的字符序列,返回自身对象(支持链式调用)。

复制代码
StringBuilder sb = new StringBuilder("Java StringBuilder");
// 删除索引 4 到 10 之间的字符
sb.delete(4, 10);
System.out.println(sb); // 输出:JavaBuilder

5. 替换操作:replace(int start, int end, String str)

start 索引(包含)到 end 索引(不包含)之间的字符替换为指定字符串 str,返回自身对象(支持链式调用)。

复制代码
StringBuilder sb = new StringBuilder("Hello World");
// 将索引 6 到 11 之间的 "World" 替换为 "Java"
sb.replace(6, 11, "Java");
System.out.println(sb); // 输出:Hello Java

6. 转换为 String 类型:toString()

StringBuilder 不能直接作为 String 类型使用,通过 toString() 方法可将其转换为不可变的 String 对象。

复制代码
StringBuilder sb = new StringBuilder("Hello");
String str = sb.append(" World").toString();
System.out.println(str); // 输出:Hello World
System.out.println(str.getClass()); // 输出:class java.lang.String

7. 获取长度与容量

  • int length():返回当前字符序列的实际长度;

  • int capacity():返回当前 StringBuilder 的容量(底层字符数组的长度)。

    StringBuilder sb = new StringBuilder("Hello");
    System.out.println("实际长度:" + sb.length()); // 输出:5
    System.out.println("当前容量:" + sb.capacity()); // 输出:21(16 + 5)

四、完整使用示例

复制代码
public class StringBuilderDemo {
    public static void main(String[] args) {
        // 1. 创建 StringBuilder,指定初始容量
        StringBuilder sb = new StringBuilder(30);
        
        // 2. 链式调用拼接数据
        sb.append("姓名:").append("张三")
          .append("\n年龄:").append(25)
          .append("\n职业:").append("Java 开发工程师");
        
        // 3. 插入数据
        sb.insert(0, "用户信息:\n");
        
        // 4. 替换数据
        sb.replace(8, 10, "李四");
        
        // 5. 反转指定部分(反转职业信息)
        int start = sb.indexOf("职业:") + 3;
        int end = sb.length();
        sb.replace(start, end, new StringBuilder(sb.substring(start, end)).reverse().toString());
        
        // 6. 输出原始 StringBuilder
        System.out.println("StringBuilder 内容:");
        System.out.println(sb);
        
        // 7. 转换为 String 类型
        String userInfo = sb.toString();
        System.out.println("\n转换为 String 后:");
        System.out.println(userInfo);
        
        // 8. 获取长度和容量
        System.out.println("\n实际长度:" + sb.length());
        System.out.println("当前容量:" + sb.capacity());
    }
}

运行结果:

复制代码
StringBuilder 内容:
用户信息:
姓名:李四
年龄:25
职业:程工发开 avaJ

转换为 String 后:
用户信息:
姓名:李四
年龄:25
职业:程工发开 avaJ

实际长度:46
当前容量:62

五、使用场景与注意事项

1. 适用场景

  • 大量字符串拼接(如循环拼接日志、拼接 SQL 语句、动态生成文本内容等);
  • 需要频繁修改字符串(插入、删除、替换、反转等操作);
  • 单线程环境下(多线程环境建议使用 StringBuffer)。

2. 注意事项

  • 避免频繁创建 StringBuilder 对象,可复用同一个对象提升性能;
  • 预估字符串最大长度,指定合适的初始容量,减少扩容带来的性能损耗;
  • StringBuilder 是线程不安全的,多线程并发修改时需手动加锁或使用 StringBuffer
  • 完成修改后,通过 toString() 转换为 String 类型,便于后续使用(如作为方法参数、存储到集合中等)。

总结

  1. StringBuilder可变字符序列 ,解决了 String 不可变导致的修改效率低下问题;
  2. 核心优势是高效 ,但非线程安全,单线程场景优先使用;
  3. 核心方法:append()(拼接)、reverse()(反转)、insert()(插入)、delete()(删除)、toString()(转 String);
  4. 使用时建议指定初始容量,减少扩容次数,提升性能
相关推荐
m4Rk_7 分钟前
【论文阅读】Agent 记忆机制(77):TSM——让记忆回到事件真正发生的时间
论文阅读·人工智能·学习·开源·github
陈年老古董12 分钟前
MediaPipe 姿态检测与脸部关键点检测
笔记·python·opencv·学习·dlib
事圆则缓19 分钟前
Java 转 Kotlin 的 Android 迁移路线
java
旺仔小馒头wang20 分钟前
AI 智能手机发布会:赋予人类的五种新能力
人工智能·学习·音视频
人工智能培训21 分钟前
未来三年,AI 落地的五个确定性判断
大数据·人工智能·学习·生活·ai写作
计算机毕设定制辅导-无忧学长24 分钟前
《基于Vue的流浪动物救助中心管理系统的设计与实现》
java·vue.js·spring boot·流浪动物救助中心管理系统
LONGZETECH27 分钟前
一线职教实测:风光 580 汽车故障诊断仿真系统,破解实车实训四大核心痛点
人工智能·学习·安全·架构·汽车
Mikko727 分钟前
jackson-databind 升到 2.21.6 就安全了吗?jackson-core 是另一个坐标,它那条 high 全局库至今没收
java·后端·安全·json
Java_AI工程师28 分钟前
90%的人写Function Calling,只写了"把参数传给工具执行"这一步,剩下的参数校验、错误重试、超时控制、结果格式化,全是空白。
java·人工智能·程序员
彧azz32 分钟前
操作系统时间管理与系统核心板块学习总结
c语言·笔记·学习·系统架构