Java StringBuilder 类
最后修改时间:2025 年 4 月 13 日
java.lang.StringBuilder 类是一个可变的字符序列。当您需要频繁修改字符串时,它提供了 String 的替代方案。与 String 对象不同,StringBuilder 对象可以在创建后进行修改。
对于连接多个字符串,StringBuilder 比 String 更有效率。 它避免了创建多个中间 String 对象。 这使其非常适合需要执行许多字符串修改的情况。
StringBuilder 类方法
StringBuilder 类提供了用于字符串操作的方法,包括附加、插入、删除和替换字符。它还包括用于容量管理和字符串反转的方法。
public final class StringBuilder {
public StringBuilder() {...}
public StringBuilder(int capacity) {...}
public StringBuilder(String str) {...}
public StringBuilder append(...) {...}
public StringBuilder insert(int offset, ...) {...}
public StringBuilder delete(int start, int end) {...}
public StringBuilder replace(int start, int end, String str) {...}
public StringBuilder reverse() {...}
public int length() {...}
public int capacity() {...}
public void ensureCapacity(int minimumCapacity) {...}
public void trimToSize() {...}
public char charAt(int index) {...}
public void setCharAt(int index, char ch) {...}
public String substring(int start) {...}
public String substring(int start, int end) {...}
}
上面的代码显示了 StringBuilder 类提供的主要方法。 这些方法允许高效的字符串操作,而无需创建新对象。
创建 StringBuilder
StringBuilder 对象可以通过多种方式创建:空的、具有初始容量的或从现有字符串创建。 默认构造函数创建一个容量为 16 的空 StringBuilder。
package com.zetcode;
public class Main {
public static void main(String[] args) {
// Empty StringBuilder with default capacity (16)
StringBuilder sb1 = new StringBuilder();
System.out.println("sb1 capacity: " + sb1.capacity());
// StringBuilder with initial capacity of 100
StringBuilder sb2 = new StringBuilder(100);
System.out.println("sb2 capacity: " + sb2.capacity());
// StringBuilder initialized with a string
StringBuilder sb3 = new StringBuilder("Hello");
System.out.println("sb3 content: " + sb3);
System.out.println("sb3 length: " + sb3.length());
System.out.println("sb3 capacity: " + sb3.capacity());
}
}
此示例演示了创建 StringBuilder 对象的不同方法。 容量会在需要时自动增加。 长度显示实际内容大小,而容量显示已分配的空间。
附加到 StringBuilder
append 方法将数据添加到 StringBuilder 的末尾。 它经过重载,可以接受各种数据类型,包括基本类型、对象和字符数组。 每个 append 都返回相同的 StringBuilder 实例。
package com.zetcode;
public class Main {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
// Append different types
sb.append("Hello");
sb.append(' ');
sb.append(123);
sb.append(' ');
sb.append(true);
sb.append(' ');
sb.append(3.14);
System.out.println(sb); // Hello 123 true 3.14
// Chaining append calls
sb.append(" and ").append("welcome!");
System.out.println(sb); // Hello 123 true 3.14 and welcome!
// Append part of a string
sb.append(" to Java programming", 0, 8);
System.out.println(sb); // Hello 123 true 3.14 and welcome! to Java
}
}
此示例显示了如何将不同的数据类型附加到 StringBuilder。 该方法用途广泛并支持方法链。 它还演示了附加较大字符串的子字符串。
插入到 StringBuilder
insert 方法将数据添加到 StringBuilder 中指定的位置。 与 append 一样,它支持各种数据类型。 偏移量必须在 StringBuilder 的当前长度之内。
package com.zetcode;
public class Main {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("Java programming");
// Insert at position 5
sb.insert(5, "is ");
System.out.println(sb); // Java is programming
// Insert various types
sb.insert(0, "Version: ");
sb.insert(8, 11);
sb.insert(10, ' ');
System.out.println(sb); // Version: 11 Java is programming
// Insert part of a string
sb.insert(20, "great ", 0, 6);
System.out.println(sb); // Version: 11 Java is great programming
}
}
此示例演示了在特定位置插入不同的数据类型。 该方法允许精确控制新内容的添加位置。 它还显示了插入较大字符串的子字符串。
删除和替换内容
delete 方法删除指定索引之间的字符。 replace 方法用新字符串替换字符。 这两种方法都在适当的位置修改 StringBuilder。
package com.zetcode;
public class Main {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("Java is awesome!");
// Delete characters from index 8 to 16
sb.delete(8, 16);
System.out.println(sb); // Java is !
// Replace characters from index 5 to 7
sb.replace(5, 7, "was");
System.out.println(sb); // Java was !
// Delete single character
sb.deleteCharAt(8);
System.out.println(sb); // Java was!
// Replace all occurrences (using toString and String methods)
String result = sb.toString().replace("was", "is");
System.out.println(result); // Java is!
}
}
此示例显示了如何在 StringBuilder 中删除和替换内容。 delete 方法删除一个范围,而 replace 替换它。 对于全局替换,首先转换为 String。
反转和修改字符
reverse 方法反转字符序列。 可以使用 charAt 和 setCharAt 访问和修改单个字符。 这些操作在适当的位置执行。
package com.zetcode;
public class Main {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("Hello World");
// Reverse the content
sb.reverse();
System.out.println(sb); // dlroW olleH
// Modify individual characters
sb.setCharAt(5, '_');
System.out.println(sb); // dlroW_olleH
// Get character at specific position
char c = sb.charAt(3);
System.out.println("Character at index 3: " + c); // o
// Get substring
String sub = sb.substring(6, 10);
System.out.println("Substring: " + sub); // olle
}
}
此示例演示了反转内容和修改单个字符。 它还显示了如何访问字符和从 StringBuilder 中提取子字符串。
容量管理
StringBuilder 自动管理内存,但提供了用于容量控制的方法。 ensureCapacity 保证最小容量,而 trimToSize 将存储空间减少到实际内容大小。
package com.zetcode;
public class Main {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
System.out.println("Initial capacity: " + sb.capacity()); // 16
System.out.println("Initial length: " + sb.length()); // 0
// Add content to exceed default capacity
sb.append("This is a long string that exceeds default capacity");
System.out.println("New capacity: " + sb.capacity()); // 34
System.out.println("New length: " + sb.length()); // 50
// Ensure minimum capacity
sb.ensureCapacity(100);
System.out.println("After ensureCapacity: " + sb.capacity()); // 100
// Trim to size
sb.trimToSize();
System.out.println("After trimToSize: " + sb.capacity()); // 50
}
}
此示例显示了 StringBuilder 的自动容量管理以及如何手动控制它。 容量根据需要增长,但可以预先分配或修剪以节省内存。
与 String 的性能比较
对于多次连接,StringBuilder 的性能明显优于 String。 此示例演示了通过重复连接构建大型字符串时的性能差异。
package com.zetcode;
public class Main {
public static void main(String[] args) {
final int ITERATIONS = 100000;
// Using String
long startTime = System.currentTimeMillis();
String result = "";
for (int i = 0; i < ITERATIONS; i++) {
result += "a";
}
long stringTime = System.currentTimeMillis() - startTime;
// Using StringBuilder
startTime = System.currentTimeMillis();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < ITERATIONS; i++) {
sb.append("a");
}
String sbResult = sb.toString();
long sbTime = System.currentTimeMillis() - startTime;
System.out.println("String concatenation time: " + stringTime + "ms");
System.out.println("StringBuilder time: " + sbTime + "ms");
System.out.println("StringBuilder is " +
(stringTime / sbTime) + " times faster");
}
}
此示例清楚地显示了 StringBuilder 对于重复字符串操作的性能优势。 String 连接创建许多中间对象,而 StringBuilder 修改单个缓冲区。
来源
在本文中,我们通过实际示例介绍了 Java StringBuilder 类的所有主要方法。 StringBuilder 对于 Java 中的高效字符串操作至关重要,尤其是在执行多次修改时。
作者
列出所有Java教程。