Rumah Java javaTutorial StringBuilder vs StringBuffer dalam Java

StringBuilder vs StringBuffer dalam Java

Nov 18, 2024 am 03:19 AM

StringBuilder vs StringBuffer in Java

Di Java, apabila bekerja dengan rentetan bolehubah (rentetan yang boleh diubah suai), anda mungkin perlu memilih antara StringBuilder dan StringBuffer. Walaupun kedua-duanya adalah kelas boleh ubah yang membenarkan pengubahsuaian nilainya, ia berbeza dengan ketara dari segi keselamatan benang, prestasi dan aplikasi. Di sini, kami akan membandingkan ciri-ciri mereka dan menyediakan contoh kod untuk menggambarkan masa untuk menggunakan setiap satu.


Perbezaan Utama: StringBuilder vs. StringBuffer

Ciri 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
Mutability Boleh ubah Boleh ubah Disimpan dalam Heap (tidak menggunakan String Pool) Heap (tidak menggunakan String Pool) Keselamatan Benang Tidak selamat untuk benang Selamat untuk benang Penyegerakan Tidak disegerakkan Disegerakkan Prestasi Lebih pantas kerana kekurangan penyegerakan Lebih perlahan disebabkan overhed penyegerakan Kes Penggunaan Senario benang tunggal Senario berbilang benang yang memerlukan keselamatan benang table>

Mari teroka setiap kelas dengan lebih terperinci.


1. StringBuilder: Pilihan Cekap untuk Persekitaran Berbenang Tunggal

  • StringBuilder ialah kelas boleh berubah, bermakna ia membenarkan pengubahsuaian pada kandungannya.

  • Ia benang-tidak selamat, jadi ia sesuai untuk senario benang tunggal.

  • Tidak disegerakkan: StringBuilder lebih pantas daripada StringBuffer kerana ketiadaan overhed penyegerakan.

  • Penghadan berbilang benang: Menggunakan StringBuilder dalam persekitaran berbilang benang tanpa langkah keselamatan tambahan boleh membawa kepada keadaan perlumbaan dan isu konkurensi yang lain.

Contoh: Menunjukkan Ketidakselamatan Benang dalam StringBuilder

Dalam contoh ini, kami menggunakan dua urutan untuk menambahkan aksara pada tika StringBuilder. Walau bagaimanapun, disebabkan kekurangan penyegerakan, kami menghadapi keadaan perlumbaan:

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();
    }
}
Salin selepas log masuk

Penjelasan:

  • Disebabkan oleh ketidakselamatan benang, panjang akhir keluaran StringBuilder tidak dapat diramalkan (mis., 1840 bukannya 2000).

  • Ini berlaku kerana kedua-dua urutan cuba menambahkan aksara secara serentak, yang membawa kepada tulis ganti atau operasi digugurkan.

Takeaway: Gunakan StringBuilder hanya dalam persekitaran satu benang atau apabila keselamatan benang dikendalikan secara luaran.


2. StringBuffer: Pilihan Selamat untuk Persekitaran Berbilang Benang

  • StringBuffer adalah boleh berubah, membenarkan pengubahsuaian pada kandungannya.

  • Ia disegerakkan, yang menjadikannya selamat untuk benang.

  • Sesuai untuk persekitaran berbilang benang yang memerlukan keselamatan benang.

  • Kos prestasi: Penyegerakan memperkenalkan overhed, jadi StringBuffer adalah lebih perlahan daripada StringBuilder.

Contoh: Keselamatan Benang dalam StringBuffer

Berikut ialah contoh yang sama seperti di atas, tetapi kali ini menggunakan 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();
    }
}
Salin selepas log masuk

Penjelasan:

  • StringBuffer memastikan kedua-dua utas disambung dengan selamat, mencapai jangkaan panjang 2000.

  • Walaupun rentetan akhir selamat untuk benang, output mungkin berjalin (cth., “AAABBB...” dicampur bersama) kerana susunan pelaksanaan benang adalah bukan deterministik.

Takeaway: Gunakan StringBuffer untuk aplikasi berbilang benang di mana ketekalan data adalah penting dan penyegerakan diperlukan.


Memilih Kelas yang Tepat

Untuk memutuskan antara StringBuilder dan StringBuffer, pertimbangkan perkara berikut:

  • Gunakan StringBuilder dalam senario benang tunggal di mana prestasi adalah kritikal dan keselamatan benang tidak menjadi kebimbangan.

  • Gunakan StringBuffer dalam senario berbilang benang di mana anda memerlukan operasi rentetan boleh ubah dan memerlukan keselamatan benang untuk mengelakkan keadaan perlumbaan.


Kesimpulan

Perbandingan ini seharusnya membantu anda membuat pilihan termaklum antara StringBuilder dan StringBuffer. Memahami pertukaran dalam kebolehubahan, prestasi dan keselamatan benang boleh membawa kepada membuat keputusan yang lebih baik apabila bekerja dengan rentetan dalam Java.


Catatan Berkaitan

  • Asas Java
  • Keperluan Temuduga Tatasusunan
  • Java Memory Essentials
  • Java Keywords Essentials
  • Java OOPs Essentials
  • Keperluan Rangka Kerja Koleksi

Selamat Pengekodan!

Atas ialah kandungan terperinci StringBuilder vs StringBuffer dalam Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tutorial Java
1664
14
Tutorial PHP
1268
29
Tutorial C#
1242
24
Adakah perisian keselamatan syarikat menyebabkan aplikasi gagal dijalankan? Bagaimana cara menyelesaikan masalah dan menyelesaikannya? Adakah perisian keselamatan syarikat menyebabkan aplikasi gagal dijalankan? Bagaimana cara menyelesaikan masalah dan menyelesaikannya? Apr 19, 2025 pm 04:51 PM

Penyelesaian masalah dan penyelesaian kepada perisian keselamatan syarikat yang menyebabkan beberapa aplikasi tidak berfungsi dengan baik. Banyak syarikat akan menggunakan perisian keselamatan untuk memastikan keselamatan rangkaian dalaman. …

Bagaimanakah saya menukar nama kepada nombor untuk melaksanakan penyortiran dan mengekalkan konsistensi dalam kumpulan? Bagaimanakah saya menukar nama kepada nombor untuk melaksanakan penyortiran dan mengekalkan konsistensi dalam kumpulan? Apr 19, 2025 pm 11:30 PM

Penyelesaian untuk menukar nama kepada nombor untuk melaksanakan penyortiran dalam banyak senario aplikasi, pengguna mungkin perlu menyusun kumpulan, terutama dalam satu ...

Bagaimana untuk memudahkan isu pemetaan medan dalam dok sistem menggunakan mapstruct? Bagaimana untuk memudahkan isu pemetaan medan dalam dok sistem menggunakan mapstruct? Apr 19, 2025 pm 06:21 PM

Pemprosesan pemetaan medan dalam dok sistem sering menemui masalah yang sukar ketika melaksanakan sistem dok: bagaimana untuk memetakan medan antara muka sistem dengan berkesan ...

Bagaimanakah Idea IntelliJ mengenal pasti nombor port projek boot musim bunga tanpa mengeluarkan log? Bagaimanakah Idea IntelliJ mengenal pasti nombor port projek boot musim bunga tanpa mengeluarkan log? Apr 19, 2025 pm 11:45 PM

Mula musim bunga menggunakan versi IntelliJideaultimate ...

Bagaimana dengan elegan mendapatkan nama pemboleh ubah kelas entiti untuk membina keadaan pertanyaan pangkalan data? Bagaimana dengan elegan mendapatkan nama pemboleh ubah kelas entiti untuk membina keadaan pertanyaan pangkalan data? Apr 19, 2025 pm 11:42 PM

Apabila menggunakan Mybatis-Plus atau Rangka Kerja ORM yang lain untuk operasi pangkalan data, sering diperlukan untuk membina syarat pertanyaan berdasarkan nama atribut kelas entiti. Sekiranya anda secara manual setiap kali ...

Bagaimana cara menukar objek Java dengan selamat ke array? Bagaimana cara menukar objek Java dengan selamat ke array? Apr 19, 2025 pm 11:33 PM

Penukaran objek dan tatasusunan Java: Perbincangan mendalam tentang risiko dan kaedah penukaran jenis cast yang betul Banyak pemula Java akan menemui penukaran objek ke dalam array ...

Bagaimana menggunakan penyelesaian cache Redis untuk merealisasikan keperluan senarai kedudukan produk dengan cekap? Bagaimana menggunakan penyelesaian cache Redis untuk merealisasikan keperluan senarai kedudukan produk dengan cekap? Apr 19, 2025 pm 11:36 PM

Bagaimanakah penyelesaian caching Redis menyedari keperluan senarai kedudukan produk? Semasa proses pembangunan, kita sering perlu menangani keperluan kedudukan, seperti memaparkan ...

Platform e-dagang SKU dan Reka Bentuk Pangkalan Data SPU: Bagaimana untuk mengambil kira kedua-dua atribut yang ditakrifkan oleh pengguna dan produk yang tidak berkesudahan? Platform e-dagang SKU dan Reka Bentuk Pangkalan Data SPU: Bagaimana untuk mengambil kira kedua-dua atribut yang ditakrifkan oleh pengguna dan produk yang tidak berkesudahan? Apr 19, 2025 pm 11:27 PM

Penjelasan terperinci mengenai reka bentuk jadual SKU dan SPU di platform e-dagang Artikel ini akan membincangkan isu reka bentuk pangkalan data SKU dan SPU dalam platform e-dagang, terutamanya bagaimana menangani jualan yang ditentukan pengguna ...

See all articles