当前位置: 首页 > article >正文

Java StringBuilder详解

Java StringBuilder 详解

在 Java 中,StringBuilder 是一个高效的、可变的字符串操作类,用于在需要频繁修改字符串内容的场景下替代不可变的 StringStringBuilder 提供了许多方法来支持字符串的拼接、插入、删除、替换等操作,且无需创建新的对象,提高了性能。


1. 为什么使用 StringBuilder

1.1 String 的局限性
  • String 是不可变的:每次对字符串进行修改(如拼接、替换等),都会创建一个新的字符串对象。
  • 如果在循环中频繁修改字符串,性能会非常低。
1.2 StringBuilder 的优势
  • StringBuilder 是可变的:对字符串的修改直接作用于当前对象,无需创建新对象。
  • 性能高:适合在需要频繁拼接或修改字符串内容时使用。

2. StringBuilder 的基本用法

2.1 创建 StringBuilder 对象
  1. 无参构造器:

    StringBuilder sb = new StringBuilder();
    

    创建一个初始容量为 16 的空 StringBuilder

  2. 指定初始容量:

    StringBuilder sb = new StringBuilder(50);
    

    创建一个初始容量为 50 的 StringBuilder

  3. 通过字符串初始化:

    StringBuilder sb = new StringBuilder("Hello");
    

    创建一个包含 "Hello"StringBuilder,初始容量为 16 + "Hello".length()


2.2 常用方法
  1. append() - 拼接字符串
    将指定数据追加到末尾。

    StringBuilder sb = new StringBuilder("Hello");
    sb.append(" World");
    System.out.println(sb); // 输出: Hello World
    
    • 支持多种数据类型:String, char, int, boolean, 等。
    • 方法链调用:sb.append("Hello").append(" World");

  1. insert() - 插入字符串
    在指定位置插入内容。

    StringBuilder sb = new StringBuilder("Hello");
    sb.insert(5, " World");
    System.out.println(sb); // 输出: Hello World
    

  1. delete() - 删除字符
    删除从 startend 索引(不包括 end)的字符。

    StringBuilder sb = new StringBuilder("Hello World");
    sb.delete(5, 11);
    System.out.println(sb); // 输出: Hello
    

  1. deleteCharAt() - 删除指定索引的字符
    StringBuilder sb = new StringBuilder("Hello");
    sb.deleteCharAt(4);
    System.out.println(sb); // 输出: Hell
    

  1. replace() - 替换字符串
    替换从 startend 索引之间的内容。

    StringBuilder sb = new StringBuilder("Hello World");
    sb.replace(6, 11, "Java");
    System.out.println(sb); // 输出: Hello Java
    

  1. reverse() - 反转字符串
    StringBuilder sb = new StringBuilder("Hello");
    sb.reverse();
    System.out.println(sb); // 输出: olleH
    

  1. setCharAt() - 修改指定索引的字符
    StringBuilder sb = new StringBuilder("Hello");
    sb.setCharAt(0, 'h');
    System.out.println(sb); // 输出: hello
    

  1. toString() - 转换为字符串
    StringBuilder sb = new StringBuilder("Hello");
    String str = sb.toString();
    System.out.println(str); // 输出: Hello
    

2.3 获取相关信息的方法
  1. length() - 获取长度

    StringBuilder sb = new StringBuilder("Hello");
    System.out.println(sb.length()); // 输出: 5
    
  2. capacity() - 获取容量

    StringBuilder sb = new StringBuilder("Hello");
    System.out.println(sb.capacity()); // 输出: 21 (16 + 5)
    
  3. charAt() - 获取指定索引的字符

    StringBuilder sb = new StringBuilder("Hello");
    System.out.println(sb.charAt(1)); // 输出: e
    
  4. substring() - 截取子字符串

    StringBuilder sb = new StringBuilder("Hello World");
    System.out.println(sb.substring(6)); // 输出: World
    System.out.println(sb.substring(0, 5)); // 输出: Hello
    

3. StringBuilderStringBuffer 的区别

特性StringBuilderStringBuffer
线程安全性非线程安全线程安全
性能性能更高(无锁机制)性能较低(使用同步机制)
推荐场景单线程环境多线程环境

4. 性能对比:String vs StringBuilder

例子:使用 String 拼接
String result = "";
for (int i = 0; i < 1000; i++) {
    result += i; // 每次都会创建新的 String 对象
}
System.out.println(result);
  • 问题:每次 + 都会创建一个新的 String,导致大量内存消耗和性能开销。

例子:使用 StringBuilder 拼接
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) {
    sb.append(i); // 直接操作内部数组,无需创建新对象
}
System.out.println(sb.toString());
  • 优势:在内部修改字符串,性能远高于 String

5. 线程安全性:是否选择 StringBuffer

  • 如果在单线程环境,推荐使用 StringBuilder
  • 如果在多线程环境,需要线程安全,则使用 StringBuffer

6. 扩展:容量与扩容机制

初始容量
  • 如果未指定,StringBuilder 默认容量为 16。
  • 如果通过字符串初始化,则容量为 16 + 字符串长度
扩容机制
  • 如果追加内容超过当前容量,StringBuilder 会自动扩容。
  • 新容量计算公式:
    newCapacity = ( oldCapacity × 2 ) + 2 \text{newCapacity} = (\text{oldCapacity} \times 2) + 2 newCapacity=(oldCapacity×2)+2

7. 示例代码:全面操作

public class StringBuilderExample {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder("Hello");

        // 追加
        sb.append(" World");
        System.out.println(sb); // Hello World

        // 插入
        sb.insert(6, "Java ");
        System.out.println(sb); // Hello Java World

        // 删除
        sb.delete(5, 10);
        System.out.println(sb); // Hello World

        // 替换
        sb.replace(6, 11, "Java");
        System.out.println(sb); // Hello Java

        // 反转
        sb.reverse();
        System.out.println(sb); // avaJ olleH

        // 获取子字符串
        System.out.println(sb.substring(0, 4)); // avaJ

        // 转换为字符串
        String result = sb.toString();
        System.out.println(result); // avaJ olleH
    }
}

总结

StringBuilder 是一个高效的字符串操作类,适合在单线程环境下频繁操作字符串的场景。通过灵活的方法(如 append, insert, delete 等),可以满足大多数字符串修改需求,同时避免了 String 带来的性能瓶颈。对于线程安全需求,可以选择 StringBuffer


http://www.kler.cn/a/397320.html

相关文章:

  • Python如何获取request response body
  • 【MySQL】SQL语言
  • 部署Apache Doris
  • 23种设计模式的Flutter实现第一篇创建型模式(一)
  • 2分钟在阿里云ECS控制台部署个人应用(图文示例)
  • 传奇996_19——常用函数
  • 数据结构《栈和队列》
  • 针对git、giteeVSCode连接的使用 || Live Share插件使用
  • 最新U盘PE启动安装Win10/Win11系统教程
  • 数据结构(初阶4)---循环队列详解
  • Oracle OCP认证考试考点详解082系列22
  • 正确使用primefaces的process和update
  • elementPlus + table 树形懒加载,子节点的刷新
  • 智慧建造-运用Trimble技术将梦幻水族馆变为现实【上海沪敖3D】
  • 算法----二分法找出有序列表指定值
  • RTSP播放器EasyPlayer.js播放器UniApp或者内嵌其他App里面webview需要截图下载
  • rust高级特征
  • 应用层协议之WebSocket
  • 分享一些关于 C 函数与 lua 交互的实际项目案例
  • 高级数据结构——hash表与布隆过滤器
  • 2024年秋国开电大《建筑工程项目招投标与合同管理》形考任务1-4
  • 【java版本中间件opc ua协议】写入数据,轮询、订阅方式读取数据
  • 鸿蒙进阶篇-Math、Date
  • Redis设计与实现第9章 -- 数据库 总结(键空间 过期策略 过期键的影响)
  • DDRPHY数字IC后端设计实现系列专题之数字后端floorplanpowerplan设计
  • 【循环测试试题2】小X与三次方