ZetCode

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。

Main.java
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 实例。

Main.java
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 的当前长度之内。

Main.java
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。

Main.java
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 方法反转字符序列。 可以使用 charAtsetCharAt 访问和修改单个字符。 这些操作在适当的位置执行。

Main.java
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 将存储空间减少到实际内容大小。

Main.java
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。 此示例演示了通过重复连接构建大型字符串时的性能差异。

Main.java
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 类文档

在本文中,我们通过实际示例介绍了 Java StringBuilder 类的所有主要方法。 StringBuilder 对于 Java 中的高效字符串操作至关重要,尤其是在执行多次修改时。

作者

我的名字是 Jan Bodnar,我是一位拥有多年经验的专注程序员。 我于 2007 年开始撰写编程文章,此后撰写了 1,400 多篇文章和八本电子书。 凭借超过八年的教学经验,我致力于分享我的知识并帮助他人掌握编程概念。

列出所有Java教程