Classes comumente usadas (2) StringBuffer e StringBuilder

1. Visão Geral

java.lang.StringBuffer representa uma sequência de caracteres variável  , você pode adicionar, excluir ou modificar o conteúdo da string e nenhum objeto novo será gerado neste momento.

StringBuilder representa também uma sequência de caracteres variável , que pode adicionar, excluir e modificar o conteúdo da string, e nenhum objeto novo será gerado neste momento.

Captura de tela do código-fonte do StringBuffer:

 

Captura de tela do código-fonte do StringBuilder:

Comparado com o valor de byte [] final privado da classe String  isto é, Stringbuffer e StringBuilder são sequências de caracteres variáveis, ambos herdam AbstractStringBuffer e esta classe abstrata tem um valor de byte [] (não final) para armazenar strings.

Primeiro, aqui está uma pergunta frequente em entrevistas:

2. Quais são as semelhanças e diferenças entre String, StringBuffer e StringBuilder?

String : sequência de caracteres imutável: a camada inferior usa o armazenamento char []

StringBuffer : sequência de caracteres variável: thread-safe, baixa eficiência, a camada inferior é armazenada usando char []

StringBuilder : sequência de caracteres variável: thread também não é seguro e eficiente, a camada inferior usa char [] para armazenar

3. Análise do código fonte

Análise do código-fonte dos três :

String str1 = new String (); equivalente a char [] value = new char [0]

String str2 = new String ("abc"); Equivalente a char [] value = new char [] {'a', 'b', 'c'}

StringBuffer sber1 = new StringBuffer (); A camada inferior é para ajudá-lo a criar uma matriz de caracteres de comprimento 16 por padrão, char [] value = new char [16]

   

O método de construção parametrizado da classe pai:

StringBuffer sber2 = new StringBuffer ("abc"); A camada inferior é para ajudá-lo a criar um comprimento de string criado + 16 por padrão, char [] value = new char ["abc" .length +16]

O método de construção parametrizado da classe pai:

1. Haverá perguntas aqui? ? ? , Se criarmos uma string de StringBuffer "abc", estamos gerando seu comprimento, length () será 19 ou 3? ?

StringBuffer stringBuffer = new StringBuffer("abc");
System.out.println(stringBuffer.length());

 A resposta é 3. O modo de depuração é usado para verificar o código-fonte. Pode ser visto que está usando str = "abc" e str.length; para modificar o valor da contagem do AbstractStringbuilder da classe pai para 3 .

Ao olhar para a explicação de contagem e o método length (): usado

Obter comprimento é usado

2. Outra questão é que a camada inferior da matriz não é suficiente para acomodar ao adicionar? ? ? A matriz está fora dos limites? ? ?

Na verdade, é a matriz de expansão subjacente

Quando o tamanho padrão é excedido, um array maior será criado [ Criar (expandir a capacidade original) * 2 + 2 ] Quando criado sem parâmetros, a capacidade original é 16, e a expansão após exceder é 34, e o original o conteúdo do array foi alterado. Copie-o e descarte o array antigo.

O código-fonte passa pelo processo de depuração:

StringBuilder e StringBuffer são iguais, o conteúdo do método. Acontece que a sincronização sincronizada é adicionada ao método para resolver o problema de segurança do thread.

4. Métodos comuns de StringBuffer

Protótipo de método Papel e significado
Anexo StringBuffer (xxx) Fornece vários métodos append () para emenda de strings
StringBuffer delete (int start, int end) Exclua o conteúdo da posição subscrita especificada
StringBuffer replace (int start, int end, String str) Substitua a posição do subscrito (início, fim) por str
StringBuffer insert (int offset, xxx) Insira xxx na posição subscrita especificada
StringBuffer reverse () Reverter a sequência de caracteres atual
public int indexOf (String str) Retorna o índice da primeira ocorrência da substring especificada nesta string
comprimento interno público () Retorna o comprimento da string
public char charAt (int n) Retorna o caractere no índice
public void setCharAt (int n, char ch) Defina o caractere ch para a posição subscrita especificada na string

Ao anexar e inserir, se o comprimento da matriz de valor original não for suficiente, ela pode ser expandida

Um resumo simples é adicionar [append ()] excluir [excluir ()] alterar [setcharAt (int n)] verificar [charAt (int n)] inserir [inserir (int index, xxx)]

5. Comparação da eficiência de String, StringBuffer, StringBuilder

Demonstração de código:

package day02;

import org.junit.Test;
public class StringMain {
    @Test
    public void test01(){
            long startTime = 0L;
            long endTime = 0L;
            String text = "";
            StringBuffer buffer = new StringBuffer("");
            StringBuilder builder = new StringBuilder("");
            //开始对比
            startTime = System.currentTimeMillis();
            for (int i = 0; i < 20000; i++) {
                buffer.append(String.valueOf(i));
            }
            endTime = System.currentTimeMillis();
            System.out.println("StringBuffer的执行时间:" + (endTime - startTime));
            startTime = System.currentTimeMillis();
            for (int i = 0; i < 20000; i++) {
                builder.append(String.valueOf(i));
            }
            endTime = System.currentTimeMillis();
            System.out.println("StringBuilder的执行时间:" + (endTime - startTime));
            startTime = System.currentTimeMillis();
            for (int i = 0; i < 20000; i++) {
                text = text + i;
            }
            endTime = System.currentTimeMillis();
            System.out.println("String的执行时间:" + (endTime - startTime));
    }
}

Resultado:

Tempo de execução de
StringBuffer : 10 Tempo de execução de StringBuilder: 4
Tempo de execução de String: 223

É claro que String é o mais lento e StringBuffer é o segundo (ele garante a segurança do thread, portanto, é mais lento que StringBuilder) StringBuilder é o mais rápido.

Eficiência alta a baixa: StringBuilder> StringBuffer> String

Questões de entrevista:

String str = null;
StringBuffer sb = new StringBuffer();
sb.append(str);
System.out.println(sb.length());//
System.out.println(sb);//
StringBuffer sb1 = new StringBuffer(str);
System.out.println(sb1);

Qual é a saída?

4

nulo

Reportar um erro

Verifique o código-fonte para saber:

 

 

Acho que você gosta

Origin blog.csdn.net/weixin_43725517/article/details/112849130
Recomendado
Clasificación