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: