首页  >  文章  >  Java  >  Java 中的 StringBuilder 与 StringBuffer

Java 中的 StringBuilder 与 StringBuffer

Susan Sarandon
Susan Sarandon原创
2024-11-18 03:19:02850浏览

StringBuilder vs StringBuffer in Java

在 Java 中,当使用 可变 字符串(可以修改的字符串)时,您可能需要在 StringBuilder 和 StringBuffer 之间进行选择。虽然两者都是允许修改其值的可变类,但它们在线程安全、性能和应用程序方面存在显着差异。在这里,我们将比较它们的特性并提供代码示例来说明何时使用它们。


主要区别:StringBuilder 与 StringBuffer

功能 字符串生成器 字符串缓冲区 标题>
Feature StringBuilder StringBuffer
Mutability Mutable Mutable
Stored in Heap (does not use String Pool) Heap (does not use String Pool)
Thread Safety Not thread-safe Thread-safe
Synchronization Not synchronized Synchronized
Performance Faster due to lack of synchronization Slower due to synchronization overhead
Use Case Single-threaded scenarios Multi-threaded scenarios where thread-safety is required
可变性 可变 可变 存储在 堆(不使用字符串池) 堆(不使用字符串池) 线程安全 非线程安全 线程安全 同步 未同步 已同步 性能 更快由于缺乏同步 由于同步开销而变慢 用例 单线程场景 需要线程安全的多线程场景 表>

让我们更详细地探索每个课程。


1. StringBuilder:单线程环境的高效选择

  • StringBuilder 是一个 可变类,这意味着它允许修改其内容。

  • 它是线程不安全,因此它非常适合单线程场景。

  • 未同步:由于没有同步开销,StringBuilder 比 StringBuffer 更快。

  • 多线程限制:在没有额外安全措施的多线程环境中使用 StringBuilder 可能会导致竞争条件和其他并发问题。

示例:演示 StringBuilder 中的线程不安全性

在此示例中,我们使用两个线程将字符附加到 StringBuilder 实例。然而,由于缺乏同步,我们遇到了竞争条件

public class StringBuilderBasics {

    public void threadUnsafe() {
        // Common resource being shared
        StringBuilder builder = new StringBuilder();

        // Thread appending "A" 1000 times
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                builder.append("A");
            }
        });

        // Thread appending "B" 1000 times
        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                builder.append("B");
            }
        });

        t1.start();
        t2.start();

        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // Result: 1840 (unpredictable)
        System.out.println("Length: " + builder.toString().length());
    }

    public static void main(String[] args) {
        new StringBuilderBasics().threadUnsafe();
    }
}

说明

  • 由于线程不安全,StringBuilder 输出的最终长度是不可预测的(例如,1840 而不是 2000)。

  • 发生这种情况是因为两个线程都尝试同时追加字符,导致覆盖删除操作

要点:仅在单线程环境中或在外部处理线程安全时使用 StringBuilder。


2. StringBuffer:多线程环境的安全选择

  • StringBuffer 是可变的,允许修改其内容。

  • 它是同步,这使得它线程安全

  • 非常适合需要线程安全的多线程环境。

  • 性能成本:同步会带来开销,因此 StringBuffer 比 StringBuilder 慢

示例:StringBuffer 中的线程安全

这里是与上面相同的示例,但这次使用 StringBuffer:

public class StringBufferBasics {

    public void threadSafe() {
        // Common resource being shared
        StringBuffer buffer = new StringBuffer();

        // Thread appending "A" 1000 times
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                buffer.append("A");
            }
        });

        // Thread appending "B" 1000 times
        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                buffer.append("B");
            }
        });

        t1.start();
        t2.start();

        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // Result: 2000
        System.out.println("Length: " + buffer.toString().length());
    }

    public static void main(String[] args) {
        new StringBufferBasics().threadSafe();
    }
}

说明

  • StringBuffer 确保两个线程安全追加,达到预期长度 2000。

  • 虽然最终字符串是线程安全的,但输出可能是交错(例如,“AAABBB...”混合在一起),因为线程执行顺序不确定.

要点:将 StringBuffer 用于数据一致性至关重要且需要同步的多线程应用程序。


选择正确的班级

要在 StringBuilder 和 StringBuffer 之间做出选择,请考虑以下因素:

  • 单线程场景中使用 StringBuilder,其中性能至关重要且线程安全不成问题。

  • 多线程场景中使用 StringBuffer,其中您需要可变字符串操作并需要线程安全以避免竞争条件。


结论

这种比较应该可以帮助您在 StringBuilder 和 StringBuffer 之间做出明智的选择。了解可变性、性能和线程安全性之间的权衡可以在使用 Java 中的字符串时做出更好的决策。


相关帖子

  • Java 基础知识
  • 数组面试要点
  • Java 内存要点
  • Java 关键字要点
  • Java OOP 基础知识
  • 集合框架要点

编码快乐!

以上是Java 中的 StringBuilder 与 StringBuffer的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn