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. 使用时建议指定初始容量,减少扩容次数,提升性能
相关推荐
loosenivy2 小时前
企业银行账户归属地查询接口如何用Java调用
java·企业银行账户归属地·企业账户查询接口·企业银行账户查询
IT 行者2 小时前
Spring Security 6.x 迁移到 7.0 的完整步骤
java·spring·oauth2
JIngJaneIL2 小时前
基于java+ vue农产投入线上管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot
东东的脑洞3 小时前
【面试突击二】JAVA基础知识-volatile、synchronized与ReentrantLock深度对比
java·面试
川贝枇杷膏cbppg3 小时前
Redis 的 AOF
java·数据库·redis
qcwl663 小时前
操作系统 真象还原 学习笔记#13
笔记·学习
车载测试工程师3 小时前
CAPL学习-CAN相关函数-概述
网络协议·学习·capl·canoe
吃喝不愁霸王餐APP开发者3 小时前
Java后端系统对接第三方外卖API时的幂等性设计与重试策略实践
java·开发语言
roman_日积跬步-终至千里3 小时前
【人工智能导论】08-学习-如何让计算机理解序列数据——用RNN/LSTM建模时序依赖,用文本嵌入表示序列元素
人工智能·rnn·学习