首頁 >Java >java教程 >Java 中的 StringBuilder 與 StringBuffer

Java 中的 StringBuilder 與 StringBuffer

Susan Sarandon
Susan Sarandon原創
2024-11-18 03:19:02907瀏覽

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