"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > StringBuilder vs StringBuffer em Java

StringBuilder vs StringBuffer em Java

Publicado em 2024-11-21
Navegar:117

StringBuilder vs StringBuffer in Java

Em Java, ao trabalhar com strings mutáveis (strings que podem ser modificadas), pode ser necessário escolher entre StringBuilder e StringBuffer. Embora ambas sejam classes mutáveis ​​​​que permitem a modificação de seus valores, elas diferem significativamente em termos de segurança, desempenho e aplicação do thread. Aqui, compararemos suas características e forneceremos exemplos de código para ilustrar quando usar cada um.


Principais diferenças: StringBuilder vs.

Recurso Construtor de String StringBuffer
Mutabilidade Mutável Mutável
Armazenado em Heap (não usa String Pool) Heap (não usa String Pool)
Segurança de thread Não é seguro para threads Thread-safe
Sincronização Não sincronizado Sincronizado
Desempenho Mais rápido devido à falta de sincronização Mais lento devido à sobrecarga de sincronização
Caso de uso Cenários de thread único Cenários multithread onde a segurança do thread é necessária

Vamos explorar cada classe com mais detalhes.


1. StringBuilder: a escolha eficiente para ambientes de thread único

  • StringBuilder é uma classe mutável, o que significa que permite modificações em seu conteúdo.

  • É thread-inseguro, por isso é ideal para cenários de single-threaded.

  • Não sincronizado: StringBuilder é mais rápido que StringBuffer devido à ausência de sobrecarga de sincronização.

  • Limitação multithread: usar StringBuilder em ambientes multithread sem medidas de segurança adicionais pode levar a condições de corrida e outros problemas de simultaneidade.

Exemplo: demonstrando a insegurança do thread no StringBuilder

Neste exemplo, usamos dois threads para acrescentar caracteres a uma instância StringBuilder. No entanto, devido à falta de sincronização, encontramos condições de corrida:

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  {
            for (int i = 0; i 



Explicação:

  • Devido à insegurança do thread, o comprimento final da saída do StringBuilder é imprevisível (por exemplo, 1840 em vez de 2000).

  • Isso acontece porque ambos os threads tentam anexar caracteres simultaneamente, levando a sobrescrições ou operações descartadas.

Conclusão: Use StringBuilder apenas em ambientes de thread único ou quando a segurança do thread for tratada externamente.


2. StringBuffer: a opção segura para ambientes multithread

  • StringBuffer é mutável, permitindo modificações em seu conteúdo.

  • É sincronizado, o que o torna thread-safe.

  • Ideal para ambientes multithreaded onde a segurança do thread é necessária.

  • Custo de desempenho: a sincronização introduz sobrecarga, então StringBuffer é mais lento que StringBuilder.

Exemplo: segurança de thread em StringBuffer

Aqui está o mesmo exemplo acima, mas desta vez usando 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  {
            for (int i = 0; i 



Explicação:

  • StringBuffer garante que ambos os threads sejam anexados com segurança, atingindo o comprimento esperado de 2.000.

  • Embora a string final seja thread-safe, a saída pode ser intercalada (por exemplo, “AAABBB...” misturados) já que a ordem de execução do thread é não determinística.

Conclusão: Use StringBuffer para aplicativos multithread onde a consistência dos dados é crucial e a sincronização é necessária.


Escolhendo a aula certa

Para decidir entre StringBuilder e StringBuffer, considere o seguinte:

  • Use StringBuilder em cenários de thread único onde o desempenho é crítico e a segurança do thread não é uma preocupação.

  • Use StringBuffer em cenários multithread onde você precisa de operações de string mutáveis ​​e exige segurança de thread para evitar condições de corrida.


Conclusão

Esta comparação deve ajudá-lo a fazer uma escolha informada entre StringBuilder e StringBuffer. Compreender as vantagens e desvantagens de mutabilidade, desempenho e segurança de thread pode levar a uma melhor tomada de decisão ao trabalhar com strings em Java.


Postagens relacionadas

  • Fundamentos de Java
  • Princípios básicos da entrevista de matriz
  • Fundamentos da memória Java
  • Fundamentos de palavras-chave Java
  • Fundamentos de Java OOP
  • Fundamentos da estrutura de coleções

Boa codificação!

Declaração de lançamento Este artigo é reproduzido em: https://dev.to/arshisaxena26/stringbuilder-vs-stringbuffer-in-java-4jlb?1 Se houver alguma infração, entre em contato com [email protected] para excluí-lo.
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3