27. 【Java教程】StringBuilder

简介: 27. 【Java教程】StringBuilder

上一节,我们学习了 Java 的 String 类,并介绍了其常用方法。本小节我们来介绍字符串的另外一个类:StringBuilder,我们将会了解到 StringBuilder 与 String 的差异,StringBuilder 的使用场景,也会介绍与 StringBuilder 类对应的 StringBuffer 类,StringBuilder 的使用方法以及其常用方法是本小节的重点学习内容。



1. StringBuilder 概述

1.1 什么是 StringBuilder

String 相似,StringBuilder 也是一个与字符串相关的类,Java 官方文档给 StringBuilder 的定义是:可变的字符序列。

1.2 为什么需要 StringBuilder

在 Java 字符串的学习中,我们知道了字符串具有不可变性,当频繁操作字符串时候,会在常量池中产生很多无用的数据(回忆图示)。


而 StringBuilder 与 String 不同,它具有可变性。相较 String 类不会产生大量无用数据,性能上会大大提高。

因此对于需要频繁操作字符串的场景,建议使用 Stringbuilder 类来代替 String 类。

2. StringBuffer 概述

2.1 定义

了解了 StringBuilder 类 ,StringBuffer 也是不得不提的一个类,Java 官方文档给出的定义是:线程安全的可变字符序列

2.2 与前者的区别

StringBuffer 是 StringBuilder 的前身,在早期的 Java 版本中应用非常广泛,它是 StringBuilder 的线程安全版本(线程我们将在后面的小节中介绍),但实现线程安全的代价是执行效率的下降。


你可以对比 StringBuilder 和 StringBuffer 的接口文档,它们的接口基本上完全一致。为了提升我们代码的执行效率,在如今的实际开发中 StringBuffer 并不常用。因此本小节的重点在 StringBuilder 的学习。

3. StringBuilder 的常用方法

3.1 构造方法

StringBuilder 类提供了如下 4 个构造方法:


StringBuilder() 构造一个空字符串生成器,初始容量为 16 个字符;

StringBuilder(int catpacity) 构造一个空字符串生成器,初始容量由参数 capacity 指定;

StringBuilder(CharSequence seq) 构造一个字符串生成器,该生成器包含与指定的 CharSequence 相同的字符。;

StringBuilder(String str) 构造初始化为指定字符串内容的字符串生成器。

其中第 4 个构造方法最为常用,我们可以使用 StringBuilder 这样初始化一个内容为 hello 的字符串:

StringBuilder str = new StringBuilder("Hello");

3.2 成员方法

StringBuilder 类下面也提供了很多与 String 类相似的成员方法,以方便我们对字符串进行操作。下面我们将举例介绍一些常用的成员方法。

3.2.1 字符串连接

可以使用 StringBuilderStringBuilder append(String str) 方法来实现字符串的连接操作。

我们知道,String 的连接操作是通过 + 操作符完成连接的:

String str1 = "Hello";
String str2 = "World";
String str3 = str1 + " " + str2;

如下是通过 StringBuilder 实现的字符串连接示例:

Hello World

由于 append() 方法返回的是一个 StringBuilder 类型,我们可以实现链式调用。例如,上述连续两个 append() 方法的调用语句,可以简化为一行语句:

str.append(" ").append("World");

如果你使用 IDE 编写如上连接字符串的代码,可能会有下面这样的提示(IntelliJ idea 的代码截图):

提示内容说可以将 StringBuilder 类型可以替换为 String 类型,也就是说可以将上边地代码改为:

String str = "Hello" + " " + "World";

这样写并不会导致执行效率的下降,这是因为 Java 编译器在编译和运行期间会自动将字符串连接操作转换为 StringBuilder 操作或者数组复制,间接地优化了由于 String 的不可变性引发的性能问题。


值得注意的是,append() 的重载方法有很多,可以实现各种类型的连接操作。例如我们可以连接 char 类型以及 float 类型,实例如下:


public class ConnectString2 {
    public static void main(String[] args) {
        StringBuilder str = new StringBuilder("小明的身高为");
        str.append(':').append(172.5f);
        System.out.println(str);
    }
}

运行结果:

小明的身高为:172.5

上面代码里连续的两个 append() 方法分别调用的是重载方法 StringBuilder append(char c)StringBuilder append(float f)

3.2.2 获取容量

可以使用 int capacity() 方法来获取当前容量,容量指定是可以存储的字符数(包含已写入字符),超过此数将进行自动分配。注意,容量与长度(length)不同,长度指的是已经写入字符的长度。

例如,构造方法 StringBuilder() 构造一个空字符串生成器,初始容量为 16 个字符。我们可以获取并打印它的容量,实例如下:

public class GetCapacity {
    public static void main(String[] args) {
        // 调用StringBuilder的无参构造方法,生成一个str对象
        StringBuilder str = new StringBuilder();
        System.out.println("str的初始容量为:" + str.capacity());
        // 循环执行连接操作
        for (int i = 0; i < 16; i ++) {
            str.append(i);
        }
        System.out.println("连接操作后,str的容量为" + str.capacity());
    }
}

运行结果:

1. str的初始容量为:16
2. 连接操作后,str的容量为34
3.2.3 字符串替换

可以使用 StringBuilder replace(int start, int end, String str) 方法,来用指定字符串替换从索引位置 start 开始到 end 索引位置结束(不包含 end)的子串。

实例如下:

public class StringReplace {
    public static void main(String[] args) {
        // 初始化一个内容为 Hello 的字符串生成器
        StringBuilder str = new StringBuilder("Hello World!");
        // 调用字符串替换方法,将 World 替换为 Java
        str.replace(6, 11, "Java");
        // 打印替换后的字符串
        System.out.println(str);
    }
}

运行结果:

Hello Java!

也可使用 StringBuilder delete(int start, int end) 方法,先来删除索引位置 start 开始到 end 索引位置(不包含 end)的子串,再使用 StringBuilder insert(int offset, String str) 方法,将字符串插入到序列的 offset 索引位置。同样可以实现字符串的替换,例如:


StringBuilder str = new StringBuilder("Hello World!");
str.delete(6, 11);
str.insert(6, "Java");
3.2.4 字符串截取

可以使用 StringBuilder substring(int start) 方法来进行字符串截取,例如,我们想截取字符串的后三个字符,实例如下:

public class StringSub {
    public static void main(String[] args) {
        StringBuilder str = new StringBuilder("你好,欢迎来到码云笔记");
        String substring = str.substring(7);
        System.out.println("str截取后子串为:" + substring);
    }
}

行结果:

str截取后子串为:码云笔记

如果我们想截取示例中的” 欢迎 “二字,可以使用重载方法 StringBuilder substring(int start, int end) 进行截取:

String substring = str.substring(3, 5);
3.2.5 字符串反转

可以使用 StringBuildr reverse() 方法,对字符串进行反转操作,例如:

1. pupublic class StringReverse {
    public static void main(String[] args) {
        StringBuilder str = new StringBuilder("Hello Java");
        System.out.println("str经过反转操作后为:" + str.reverse());
    }
}

运行结果:

str经过反转操作后为:avaJ olleH

4. 小结

本小节我们介绍了 Java 的 StringBuilder 类,它具有可变性,对于频繁操作字符串的场景,使用它来代替 String 类可以提高程序的执行效率;也知道了 StringBuffer 是 StringBuilder 的线程安全版本,官方更推荐使用 StringBuilder;最后我们介绍了 StringBuilder 的常用构造方法和成员方法,如果你想了解更多关于 StringBuilder 的接口,可以翻阅官方文档进行学习。


相关文章
|
4月前
|
Java 关系型数据库 数据库
Java 项目实战教程从基础到进阶实战案例分析详解
本文介绍了多个Java项目实战案例,涵盖企业级管理系统、电商平台、在线书店及新手小项目,结合Spring Boot、Spring Cloud、MyBatis等主流技术,通过实际应用场景帮助开发者掌握Java项目开发的核心技能,适合从基础到进阶的学习与实践。
520 3
|
3月前
|
安全 Java
Java之泛型使用教程
Java之泛型使用教程
256 10
|
2月前
|
Oracle Java 关系型数据库
Java 简单教程
Java是跨平台、面向对象的编程语言,广泛用于企业开发、Android应用等。本教程涵盖环境搭建、基础语法、流程控制、面向对象、集合与异常处理,助你快速入门并编写简单程序,为进一步深入学习打下坚实基础。
329 0
|
10月前
|
JavaScript NoSQL Java
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
477 96
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
|
5月前
|
缓存 安全 Java
Java 并发新特性实战教程之核心特性详解与项目实战
本教程深入解析Java 8至Java 19并发编程新特性,涵盖CompletableFuture异步编程、StampedLock读写锁、Flow API响应式流、VarHandle内存访问及结构化并发等核心技术。结合电商订单处理、缓存系统、实时数据流、高性能计数器与用户资料聚合等实战案例,帮助开发者高效构建高并发、低延迟、易维护的Java应用。适合中高级Java开发者提升并发编程能力。
154 0
|
6月前
|
Oracle Java 关系型数据库
java 编程基础入门级超级完整版教程详解
这份文档是针对Java编程入门学习者的超级完整版教程,涵盖了从环境搭建到实际项目应用的全方位内容。首先介绍了Java的基本概念与开发环境配置方法,随后深入讲解了基础语法、控制流程、面向对象编程的核心思想,并配以具体代码示例。接着探讨了常用类库与API的应用,如字符串操作、集合框架及文件处理等。最后通过一个学生成绩管理系统的实例,帮助读者将理论知识应用于实践。此外,还提供了进阶学习建议,引导学员逐步掌握更复杂的Java技术。适合初学者系统性学习Java编程。资源地址:[点击访问](https://pan.quark.cn/s/14fcf913bae6)。
756 2
|
11月前
|
消息中间件 Java 数据库
自研Java框架 Sunrays-Framework使用教程「博客之星」
### Sunrays-Framework:助力高效开发的Java微服务框架 **Sunrays-Framework** 是一款基于 Spring Boot 构建的高效微服务开发框架,深度融合了 Spring Cloud 生态中的核心技术组件。它旨在简化数据访问、缓存管理、消息队列、文件存储等常见开发任务,帮助开发者快速构建高质量的企业级应用。 #### 核心功能 - **MyBatis-Plus**:简化数据访问层开发,提供强大的 CRUD 操作和分页功能。 - **Redis**:实现高性能缓存和分布式锁,提升系统响应速度。 - **RabbitMQ**:可靠的消息队列支持,适用于异步
自研Java框架 Sunrays-Framework使用教程「博客之星」
|
12月前
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
10810 5
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)