StringBuilder e StringBuffer são duas classes comumente usadas para manipular strings. Como todos sabemos, o StringBuilder é inseguro, enquanto o StringBuffer é seguro para threads. O primeiro foi adicionado pelo JDK1.5, e o último estava disponível no JDK1.0. Vamos analisar suas implementações internas abaixo.
1. Relacionamento de herança
Classe final public StringBufferextends AbstractStringBuilderImplements java.io.Serializable, CHARSEMENCENCIONAL CLASSE final StringBuilderextends AbstractStringBuilderImplements Java.io.Serializable, Charquence
Pode -se observar que a relação de herança entre as duas classes é exatamente a mesma. Serializável é uma bandeira serializável. A interface Charsequence inclui métodos Charat (), Length (), subsequence () e ToString (). A classe String também implementa essa interface. O foco aqui está na classe abstrata AbstractStringBuilder, que encapsula a implementação da maioria das operações do StringBuilder e StringBuffer.
2. AbstractStringBuilder
1. Variáveis e métodos de construção
char [] valor; int contagem; abstratestringbuilder () {} abstringstringbuilder (intaconity) {value = new char [capacidade];}AbstractStringBuilder usa uma matriz de char [] para salvar strings, e o método de capacidade inicial pode ser especificado durante a construção.
2. Expanda a capacidade
public void ensureCapacity(int minimumCapacity) { if (minimumCapacity > 0) ensureCapacityInternal(minimumCapacity);} private void ensureCapacityInternal(int minimumCapacity) { // overflow-conscious code if (minimumCapacity - value.length > 0) expandCapacity(minimumCapacity);}void expandCapacity(int MiniMumCapacity) {int newCapacity = value.Length * 2 + 2; if (newCapacity - MiniMumCapacity <0) newCapacity = MinimumumCapacity; if (newCapacity <0) {if (minimumcapacidade <0) // Overflow lança novo outOfMemoryError (); newCapacity = Integer.max_value; } value = Arrays.copyof (valor, newcapacity);}O método de expansão é implementado por ExpandCapacity (). Nesse método, a capacidade é expandida primeiro para a capacidade original mais 2. Se ainda for menor que a capacidade especificada no momento, a nova capacidade será definida como uma capacidade mínima. Em seguida, determine se está transbordando. Se estiver transbordando, defina a capacidade de inteiro.max_value. Finalmente, copiar o valor do valor é obviamente uma operação demorada.
3. Método Append ()
public abstringStringBuilder Append (String str) {if (str == null) retorna appendNull (); int len = str.Length (); garantir o internal (contagem + len); str.getchars (0, len, valor, contagem); contagem += len; devolver isso; }Append () é o método mais comumente usado, possui muitas formas de sobrecarga. O acima é um deles, usado para anexar seqüências de caracteres. Se o STR for nulo, o método AppendNull () será chamado. Esse método realmente adiciona caracteres como 'n', 'u', 'l' e 'l'. Se não for nulo, primeiro expanda a capacidade e depois ligue para o método getChars () para anexar STR até o final do valor. Finalmente, o próprio objeto é retornado, portanto, apêndice () pode ser chamado continuamente.
3. Stringbuilder
AbstractStringBuilder implementou a maioria dos métodos necessários, e o StringBuilder e o StringBuffer só precisam ser chamados. Vamos dar uma olhada na implementação do StringBuilder.
1. Construtor
public stringbuilder () {super (16);} public stringbuilder (int capacidade) {super (capacidade);} public stringbuilder (string str) {super (str.Length () + 16); anexar (str);} public stringbuilder (charsequence seq) {this (seq.length () + 16); anexar (seq);}Como pode ser visto, o tamanho da capacidade padrão do StringBuilder é 16. É claro que você também pode especificar a capacidade inicial ou atribuir o valor inicial ao objeto StringBuilder em uma sequência existente de caracteres.
2. Método Append ()
public stringbuilder append (string str) {super.append (str); Retorne isso;} public stringbuilder Append (Charsequence s) {super.append (s); devolver isso;}Existem muitos métodos de sobrecarga para append (), e aqui estão dois deles. Obviamente, aqui está o método da classe pai AbstractStringBuilder que é chamado diretamente.
3. ToString ()
public string tostring () {// Crie uma cópia, não compartilhe a matriz retorna new string (valor, 0, contagem);}O método tostring () retorna um novo objeto String que não compartilha memória com o objeto original. De fato, o mesmo vale para o método de substring () no abstringstringbuilder.
4. Sringbuffer
O STIRINGBUFFER é semelhante ao StringBuilder, mas, para obter sincronização, muitos métodos usam modificação lsynchronizada, como o seguinte método:
public sincronizado int length () {Return count;} public sincronizado StringBuffer Append (String str) {tostringcache = null; super.append (str); Retorne este;} public sincronizado void SetLength (int newLength) {tostringcache = null; Super.setLength (NewLength);} Como você pode ver, o sincronizado é realmente adicionado na frente do método.
Além disso, há também uma variável tostringcache nos métodos Append () e setLength () acima. Essa variável é usada para o último cache do método ToString (). Sempre que o StringBuffer for modificado, essa variável será atribuída a NULL. A tostração do StringBuffer é a seguinte:
public string sincronizada tostring () {if (tostringcache == null) {tostringcache = arrays.copyofRange (valor, 0, contagem); } Retorne nova string (TostringCache, true);}Neste método, se o tostringcache for nulo, ele será cache primeiro. O objeto final de string retornado é um pouco diferente e esse construtor possui um parâmetro true. Encontre o código -fonte da string e dê uma olhada:
String (char [] valor, compartilhamento booleano) {// afirma compartilhar: "não compartilhado não suportado"; this.value = value;}Acontece que o objeto String construído por esse método de construção não copia a string, mas apenas aponta o valor para os parâmetros de construção, que é economizar elementos de copiar tempo. No entanto, esse construtor possui permissões de acesso ao pacote e não pode ser chamado em geral.
Resumir
O acima é tudo sobre este artigo. Espero que seja útil que todos aprendam duas classes de cordas operacionais comumente usadas em Java, Stringbuilder e StringBuffer.