Java StringBuffer 类
最后修改时间:2025 年 4 月 13 日
java.lang.StringBuffer
类是一个线程安全、可变的字符序列。 与 String 对象不同,StringBuffer 在创建后可以被修改。 它提供了各种用于字符串操作的方法。
StringBuffer 与 StringBuilder 类似,但有一个关键区别:它的所有方法都是同步的,使其成为线程安全的。 这使得 StringBuffer 成为在多线程环境中处理字符串的理想选择。
StringBuffer 类方法
StringBuffer 类提供了许多用于字符串操作的方法。 这些方法包括用于追加、插入、删除和反转内容的方法。 该类还提供了容量管理方法。
public final class StringBuffer { public StringBuffer() {...} public StringBuffer(int capacity) {...} public StringBuffer(String str) {...} public synchronized StringBuffer append(...) {...} public synchronized StringBuffer insert(...) {...} public synchronized StringBuffer delete(...) {...} public synchronized StringBuffer reverse() {...} public synchronized int length() {...} public synchronized int capacity() {...} public synchronized void ensureCapacity(int minimum) {...} public synchronized char charAt(int index) {...} public synchronized void setCharAt(int index, char ch) {...} public synchronized String substring(...) {...} public synchronized String toString() {...} }
上面的代码显示了 StringBuffer 类提供的主要方法。 这些方法允许灵活的字符串操作,同时保持线程安全。
创建 StringBuffer 对象
StringBuffer 对象可以通过多种方式创建:不带初始内容、带初始字符串或带指定的初始容量。 容量决定了最初分配的内存量。
package com.zetcode; public class Main { public static void main(String[] args) { // Empty StringBuffer with default capacity (16) StringBuffer sb1 = new StringBuffer(); System.out.println("sb1 capacity: " + sb1.capacity()); // StringBuffer with initial string StringBuffer sb2 = new StringBuffer("Hello"); System.out.println("sb2 content: " + sb2); System.out.println("sb2 capacity: " + sb2.capacity()); // StringBuffer with specified capacity StringBuffer sb3 = new StringBuffer(50); System.out.println("sb3 capacity: " + sb3.capacity()); // Adding content to empty buffer sb1.append("Java StringBuffer"); System.out.println("sb1 content: " + sb1); } }
此示例演示了创建 StringBuffer 对象的不同方法。 默认构造函数创建一个容量为 16 的空缓冲区。 String 构造函数创建一个具有字符串内容和适当容量的缓冲区。
append 方法
append
方法将内容添加到 StringBuffer 的末尾。 它被重载以接受各种数据类型,包括基本类型、对象和字符数组。 该方法返回相同的 StringBuffer,用于方法链式调用。
package com.zetcode; public class Main { public static void main(String[] args) { StringBuffer sb = new StringBuffer(); // Appending different types sb.append("String: "); sb.append(100); // int sb.append(' '); // char sb.append(true); // boolean sb.append(3.14); // double sb.append(new char[]{'a', 'b', 'c'}); // char array System.out.println("After append: " + sb); // Method chaining sb.append(" more ").append("text"); System.out.println("After chaining: " + sb); // Capacity grows automatically System.out.println("Final capacity: " + sb.capacity()); } }
此示例显示了 append
方法如何处理不同的数据类型。 StringBuffer 会在需要时自动增加其容量。 方法链式调用通过返回 StringBuffer 引用来实现简洁的代码。
insert 方法
insert
方法在 StringBuffer 中的指定位置添加内容。 与 append 类似,它支持各种数据类型。 该位置必须在缓冲区的当前边界内。
package com.zetcode; public class Main { public static void main(String[] args) { StringBuffer sb = new StringBuffer("Java is great"); // Insert at position 4 sb.insert(4, " programming"); System.out.println("After first insert: " + sb); // Insert different types sb.insert(0, 2023); // int sb.insert(4, ' '); // char sb.insert(5, true); // boolean System.out.println("After multiple inserts: " + sb); // Insert at the end (same as append) sb.insert(sb.length(), " language"); System.out.println("Final result: " + sb); // Invalid position throws exception try { sb.insert(100, "error"); } catch (StringIndexOutOfBoundsException e) { System.out.println("Caught exception: " + e.getMessage()); } } }
此示例演示了具有不同数据类型的 insert
方法。 我们展示了有效的插入位置以及尝试在无效位置插入时会发生什么。 在 length() 处插入等同于 append。
delete 和 deleteCharAt 方法
delete
方法删除指定索引之间的字符序列。 deleteCharAt
方法删除指定位置的单个字符。 这两种方法都会相应地调整缓冲区内容。
package com.zetcode; public class Main { public static void main(String[] args) { StringBuffer sb = new StringBuffer("Java StringBuffer Example"); // Delete range (start inclusive, end exclusive) sb.delete(5, 17); System.out.println("After delete: " + sb); // Delete single character sb.deleteCharAt(5); System.out.println("After deleteCharAt: " + sb); // Delete from start sb.delete(0, 4); System.out.println("After deleting first word: " + sb); // Delete to end sb.delete(5, sb.length()); System.out.println("After deleting suffix: " + sb); // Invalid indices throw exception try { sb.delete(10, 5); } catch (StringIndexOutOfBoundsException e) { System.out.println("Caught exception: " + e.getMessage()); } } }
此示例显示了各种删除操作。 delete 方法删除两个索引之间的字符(包括起始索引,不包括结束索引)。 我们演示了删除范围、单个字符和处理无效索引。
reverse 方法
reverse
方法反转 StringBuffer 中字符的顺序。 此操作在原地执行,修改原始缓冲区。 该方法返回 StringBuffer 引用,用于方法链式调用。
package com.zetcode; public class Main { public static void main(String[] args) { StringBuffer sb = new StringBuffer("Hello World"); System.out.println("Original: " + sb); // Reverse the content sb.reverse(); System.out.println("Reversed: " + sb); // Reverse back to original sb.reverse(); System.out.println("Reversed again: " + sb); // Palindrome check StringBuffer palindrome = new StringBuffer("madam"); System.out.println(palindrome + " is palindrome: " + palindrome.toString().equals(palindrome.reverse().toString())); // Method chaining System.out.println(new StringBuffer("abc") .append("def") .reverse() .insert(3, "---")); } }
此示例演示了 reverse
方法。 我们展示了简单的反转、回文检查以及将 reverse 与其他 StringBuffer 操作结合使用的方法链式调用。 反转直接影响原始缓冲区。
容量管理
StringBuffer 使用容量系统管理内存。 容量是分配的内存量,而长度是实际内容大小。 ensureCapacity
和 setLength
等方法有助于管理这一点。
package com.zetcode; public class Main { public static void main(String[] args) { // Default capacity is 16 StringBuffer sb = new StringBuffer(); System.out.println("Initial capacity: " + sb.capacity()); System.out.println("Initial length: " + sb.length()); // Adding content grows capacity as needed sb.append("This is a long string that exceeds default capacity"); System.out.println("After append - capacity: " + sb.capacity()); System.out.println("After append - length: " + sb.length()); // Ensure minimum capacity sb.ensureCapacity(100); System.out.println("After ensureCapacity(100): " + sb.capacity()); // Set explicit length sb.setLength(10); System.out.println("After setLength(10): " + sb); System.out.println("New length: " + sb.length()); // Trim to size sb.trimToSize(); System.out.println("After trimToSize - capacity: " + sb.capacity()); } }
此示例演示了 StringBuffer 容量管理。 缓冲区会在需要时自动增长,但我们也可以使用 ensureCapacity
预先分配空间。 setLength
可以截断或扩展内容,而 trimToSize
减小容量以匹配长度。
线程安全演示
StringBuffer 的线程安全性使其适用于多线程环境。 多个线程可以安全地调用 StringBuffer 方法,而无需外部同步。 此示例演示了此行为。
package com.zetcode; public class Main { public static void main(String[] args) throws InterruptedException { final StringBuffer sharedBuffer = new StringBuffer(); // Create multiple threads that append to the same buffer Thread[] threads = new Thread[5]; for (int i = 0; i < threads.length; i++) { final int threadId = i; threads[i] = new Thread(() -> { for (int j = 0; j < 10; j++) { sharedBuffer.append("Thread " + threadId + ": " + j + "\n"); try { Thread.sleep(10); // Simulate work } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } }); } // Start all threads for (Thread t : threads) { t.start(); } // Wait for all threads to complete for (Thread t : threads) { t.join(); } // Verify all additions were made safely System.out.println("Final buffer content:"); System.out.println(sharedBuffer); System.out.println("Total length: " + sharedBuffer.length()); } }
此示例演示了 StringBuffer 的线程安全性。 多个线程并发地追加到同一个 StringBuffer,而不会发生数据损坏。 同步方法确保所有操作都以原子方式完成。 最终长度确认所有添加都已保留。
来源
在本文中,我们通过实际示例介绍了 Java StringBuffer 类的所有主要方面。 StringBuffer 提供了线程安全、可变的字符串操作,这对于多线程环境中复杂的字符串操作至关重要。
作者
列出所有Java教程。