Java StringBuilder 字符串操作方法及API整理
本文将深入解析 Java 中的可变字符串类 StringBuilder。作为 StringBuffer 的非线程安全替代方案,StringBuilder 在单线程环境下能提供更高效的字符串增删改查能力。文章梳理了其继承关系、核心 API 列表,并通过完整的代码示例演示了插入、追加、替换、删除及索引查找等关键操作的用法与执行结果。
结果或目标
通过阅读本篇内容,你将能够:了解 StringBuilder 的内部机制;熟练掌握其常用操作方法;在需要频繁修改字符串的场景中选择并使用此类以提升性能。
准备条件
0. StringBuilder 类型简介
StringBuilder 是一个可变的字符序列,它继承于 AbstractStringBuilder 抽象类并实现了 CharSequence 接口。其内部底层通过字符数组实现存储,并且支持动态扩容。
在使用上,StringBuilder 与 StringBuffer 的方法基本一致。唯一的核心区别在于线程安全性:StringBuilder 是线程不安全的,因此它在单一线程的使用假设下性能更高;而 StringBuffer 则是线程安全的。当不需要处理多线程并发问题时,推荐使用 StringBuilder。
通常实例化时若不指定初始大小,容量会自动根据参数长度加 16 进行设定。以下是该类的继承与实现结构:
第1步:获取 StringBuilder 常用 API 方法表
目的:熟悉该类提供的所有标准操作方法。
动作:参考以下核心方法列表。这些方法涵盖了从基础构造到复杂字符操作的各种需求:
StringBuilder()
StringBuilder(int capacity)
StringBuilder(CharSequence seq)
StringBuilder(String str)
// 添加/插入/替换相关
StringBuilder append(...) / insert(...) / replace(...) / reverse() / delete(...) / deleteCharAt(...)
// 查找/查询相关
int capacity() / charAt(int index) / indexOf(String subString) / lastIndexOf(...) / length()
// 其他功能
void setCharAt(int index, char ch) / void setLength(int length) / String toString()
真实操作顺序
为了更直观地理解 StringBuilder 的各项功能,下面分模块展示具体的测试代码及运行结果。
第2步:演示插入 (insert) 相关 API
入口/代码:`StringBuilderInsertTest.java`
动作说明:insert() 方法允许在指定的偏移量位置插入各种类型的对象(如字符数组、浮点数、布尔值、甚至其他的 StringBuilder 或 HashMap 对象)。特别注意插入区间参数时的包含与排除规则(起始位包含,结束位不包含)。
import java.util.HashMap;
public class StringBuilderInsertTest {
public static void main(String[] args) {
testInsertAPIs();
}
private static void testInsertAPIs() {
StringBuilder sbuilder = new StringBuilder();
// 插入字符数组
sbuilder.insert(0, new char[]{'a','b','c','d','e'});
// 插入部分字符数组(从索引0开始取3个)
sbuilder.insert(0, new char[]{'A','B','C','D','E'}, 0, 3);
// 插入不同类型的原生数据
sbuilder.insert(0, 1.414f);
sbuilder.insert(0, 3.14159d);
sbuilder.insert(0, true);
sbuilder.insert(0, '\n');
sbuilder.insert(0, 100);
sbuilder.insert(0, 12345L);
// 插入对象
sbuilder.insert(0, new StringBuilder("StringBuilder"));
sbuilder.insert(0, new StringBuilder("STRINGBUILDER"), 6, 13);
sbuilder.insert(0, new StringBuffer("StringBuffer"));
sbuilder.insert(0, new StringBuffer("STRINGBUFFER"), 6, 12);
sbuilder.insert(0, "String");
sbuilder.insert(0, "0123456789", 1, 6);
sbuilder.insert(0, '\n');
// 插入 Map 对象
HashMap map = new HashMap();
map.put("1", "one");
map.put("2", "two");
map.put("3", "three");
sbuilder.insert(0, map);
System.out.printf("%s\n\n", sbuilder);
}
}
可观察结果:控制台打印出合并后的长字符串及 Map 内容的序列化形式。插入总是发生在索引 0 的位置,将之前的元素不断推向后方。
第3步:演示追加 (append) 相关 API
入口/代码:`StringBuilderAppendTest.java`
动作说明:append() 用于在序列末尾添加内容。除了常规数据类型,还可以使用 appendCodePoint() 追加 Unicode 编码对应的字符(如汉字)。
import java.util.HashMap;
public class StringBuilderAppendTest {
public static void main(String[] args) {
testAppendAPIs();
}
private static void testAppendAPIs() {
StringBuilder sbuilder = new StringBuilder();
sbuilder.append(new char[]{'a','b','c','d','e'});
sbuilder.append(new char[]{'A','B','C','D','E'}, 0, 3);
sbuilder.append(1.414f);
sbuilder.append(3.14159d);
sbuilder.append(true);
sbuilder.append('\n');
sbuilder.append(100);
sbuilder.append(12345L);
sbuilder.append(new StringBuilder("StringBuilder"));
sbuilder.append(new StringBuilder("STRINGBUILDER"), 6, 13);
sbuilder.append(new StringBuffer("StringBuffer"));
sbuilder.append(new StringBuffer("STRINGBUFFER"), 6, 12);
sbuilder.append("String");
sbuilder.append("0123456789", 1, 6);
sbuilder.append('\n');
HashMap map = new HashMap();
map.put("1", "one");
map.put("2", "two");
map.put("3", "three");
sbuilder.append(map);
sbuilder.append('\n');
// 追加特定 unicode 汉字
sbuilder.appendCodePoint(0x5b57); // 字
sbuilder.appendCodePoint(0x7b26); // 符
sbuilder.appendCodePoint(0x7f16); // 编
sbuilder.appendCodePoint(0x7801); // 码
System.out.printf("%s\n\n", sbuilder);
}
}
可观察结果:输出包含各类数字、字母、布尔值及由 Unicode 编码转换而来的“字符编码”字样。
第4步:演示替换 (replace) 及反转 API
入口/代码:`StringBuilderReplaceTest.java`
动作说明:replace(int start, int end, String str) 用来替换区间内的字符。另外展示了 reverse() 的反转功能和 setCharAt() 的单点修改功能。
public class StringBuilderReplaceTest {
public static void main(String[] args) {
testReplaceAPIs();
}
private static void testReplaceAPIs() {
StringBuilder sbuilder;
// 替换前3个字符
sbuilder = new StringBuilder("0123456789");
sbuilder.replace(0, 3, "ABCDE");
System.out.printf("sbuilder=%s\n", sbuilder);
// 翻转整个字符串
sbuilder = new StringBuilder("0123456789");
sbuilder.reverse();
System.out.printf("sbuilder=%s\n", sbuilder);
// 修改索引0处的字符为 'M'
sbuilder = new StringBuilder("0123456789");
sbuilder.setCharAt(0, 'M');
System.out.printf("sbuilder=%s\n", sbuilder);
}
}
可观察结果:
sbuilder=ABCDE3456789sbuilder=9876543210sbuilder=M123456789
第5步:演示删除 (delete) 及提取 API
入口/代码:`StringBuilderDeleteTest.java`
动作说明:使用 deleteCharAt(int index) 删除单个位置的字符,使用 delete(int start, int end) 删除区间字符。同时演示了如何基于现有 StringBuilder 提取子串 substring() 和 subSequence()。
public class StringBuilderDeleteTest {
public static void main(String[] args) {
testDeleteAPIs();
}
private static void testDeleteAPIs() {
StringBuilder sbuilder = new StringBuilder("0123456789");
// 删除索引0的字符
sbuilder.deleteCharAt(0);
// 删除索引3到6之间的字符
sbuilder.delete(3, 6);
String str1 = sbuilder.substring(1);
String str2 = sbuilder.substring(3, 5);
String str3 = (String)sbuilder.subSequence(3, 5);
System.out.printf("sbuilder=%s\nstr1=%s\nstr2=%s\nstr3=%s\n",
sbuilder, str1, str2, str3);
}
}
可观察结果:
sbuilder=123789str1=23789str2=78,str3=78
第6步:演示索引查找 (index) 相关 API
入口/代码:`StringBuilderIndexTest.java`
动作说明:演示如何使用 indexOf() 和 lastIndexOf() 从前向后或从后向前搜索子串的位置。
public class StringBuilderIndexTest {
public static void main(String[] args) {
testIndexAPIs();
}
private static void testIndexAPIs() {
StringBuilder sbuilder = new StringBuilder("abcAbcABCabCaBcAbCaBCabc");
System.out.printf("sbuilder=%s\n", sbuilder);
// 1. 从头寻找 "bc"
System.out.printf("%-30s = %d\n", "sbuilder.indexOf(\"bc\")", sbuilder.indexOf("bc"));
// 2. 从索引5之后寻找 "bc"
System.out.printf("%-30s = %d\n", "sbuilder.indexOf(\"bc\", 5)", sbuilder.indexOf("bc", 5));
// 3. 倒序寻找 "bc"
System.out.printf("%-30s = %d\n", "sbuilder.lastIndexOf(\"bc\")", sbuilder.lastIndexOf("bc"));
// 4. 从索引4开始倒序寻找 "bc"
System.out.printf("%-30s = %d\n", "sbuilder.lastIndexOf(\"bc\", 4)", sbuilder.lastIndexOf("bc", 4));
}
}
可观察结果:
sbuilder.indexOf("bc") = 1sbuilder.indexOf("bc", 5) = 22sbuilder.lastIndexOf("bc") = 22sbuilder.lastIndexOf("bc", 4) = 4
第7步:其它常见 API 操作演示
入口/代码:`StringBuilderOtherTest.java`
动作说明:获取总容量 capacity(),获取特定索引字符 charAt(),以及复制字符区域 getChars()。
public class StringBuilderOtherTest {
public static void main(String[] args) {
testOtherAPIs();
}
private static void testOtherAPIs() {
StringBuilder sbuilder = new StringBuilder("0123456789");
int cap = sbuilder.capacity();
System.out.printf("cap=%d\n", cap);
char c = sbuilder.charAt(6);
System.out.printf("c=%c\n", c);
char[] carr = new char[4];
sbuilder.getChars(3, 7, carr, 0);
for (int i=0; i
可观察结果:
cap=26(默认初始长度10 + 预留16)c=6carr=[0]=3 carr[1]=4 carr[2]=5 carr[3]=6
完成判断与总结
将上述各步骤整合,可以编写一个综合示例程序(如 StringBuilderTest.java),按顺序调用上述所有测试函数,从而全面验证 StringBuilder 的各项特性。
总结:StringBuilder 提供了极其丰富的 API 以支持对字符串内容的任意变动。在处理大量字符串拼接、修改时,它能有效避免创建过多中间对象带来的性能损耗。只要遵循单线程环境下的使用规范,它将是 Java 开发者不可或缺的工具之一。
以上就是 Java StringBuilder 字符串操作方法及API整理的详细内容,更多关于 Java 字符串处理的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









