Porque al observar el código fuente de StringBuffer y StringBuilder, se descubrió que ambos heredaron el abstracto de StringBuilder, y muchos métodos son métodos de la clase principal abstractStringBuilder directamente, por lo que decidí mirar primero el código fuente de AbstractStringBuilder, y luego mirar StringBuffer y StringBuilder.
Ubicación: en el paquete java.lang
Declaración: Clase abstracta AbstractStringBuilderImplements Agradable, CharSECHENCE
La clase AbstractStringBuilder tiene una modificación abstracta, que muestra que no se puede instanciar.
La clase AbstractStringBuilder tiene dos subclases: StringBuilder y StringBuffer.
Campos
/*** El valor se utiliza para el almacenamiento de personajes. */ Char valor []; /*** El recuento es el número de caracteres utilizados. */ int count;
Constructor
1. Constructor sin parámetros
AbstractStringBuilder () {}2. Al crear un objeto de la clase de implementación de AbstractStringBuilder, especifique el tamaño del búfer a la capacidad.
AbstractStringBuilder (int capacidad) {valor = nuevo char [capacidad]; }Cuando se instancia el subclase StringBuilder o StringBuffer, este constructor se llama en el constructor.
Expandir la capacidad
void expandCapacity(int minimumCapacity)
Este método tiene permisos de acceso a paquetes, y múltiples métodos en la clase llamarán a este método para expandir la capacidad cuando la capacidad es insuficiente.
Código fuente:
void expandcapacity (int mintercapacity) {int newCapacity = (value.length + 1) * 2; if (newCapacity <0) {newCapacity = Integer.max_value; } else if (mínimoCapacity> newCapacity) {newCapacity = mínimoCapacity; } value = arrays.copyOf (valor, newcapacity); }Agregue la longitud del búfer por 1 por 2 a la variable Newcapacity, luego compare este valor con el valor especificado y determine el valor mayor como la nueva capacidad del búfer; Luego llame al método de copia de la clase de matrices, que crea una nueva matriz y luego copie todos los caracteres en la matriz original en la nueva matriz.
EnsureCapacity (int mínimo de capacidad)
Public void Ensurecapacity (int mínimo de capacidad)
Asegúrese de que la capacidad sea al menos igual al valor mínimo especificado. Si la capacidad actual es menor que el valor especificado, se crea una nueva matriz y la capacidad de la nueva matriz es el doble del valor especificado más 2; Si la capacidad actual no es menor que el valor especificado, no se realiza ningún procesamiento directamente.
Código fuente:
public void setUreCapacity (int minmumCapacity) {if (mínimoCapacity> value.length) {expandCapacity (mínimoCapacity); }}prueba:
StringBuffer s = new StringBuffer (); System.out.println ("Capacidad:" + S.Capacity ()); // Capacidad: 16 S.SensUreCapacity (10); System.out.println ("Capacidad:" + s.capacity ()); // Capacidad: 16 s.ensurecapacity (30); System.out.println ("Capacidad:" + S.Capacity ()); // Capacidad: 34 S.SensUreCapacity (80); System.out.println ("Capacidad:" + S.Capacity ()); // Capacidad: 80método
El método CodePointat se implementa usando caracteres. CODEPOINTATIMPL (Valor, índice, recuento)
public int CodePointat (int index) {if ((index <0) || (index> = count)) {tire nuevo StringInDexOutofBoundseException (index); } return caracteres.CodePointAtImpl (valor, índice, recuento); }El método GetChars se implementa utilizando el método System.ArrayCopy ()
public void getChars (int srcbegin, int srcend, char [] dst, int dstbegin) {if (srcbegin <0) tirar nueva stringintexoUtofBoundsexception (srcbegin); if ((srcend <0) || (srcend> count)) tire nuevo stringindexoUtofboundsexception (srcend); if (srcbegin> srcend) tire nuevo stringindexoUtofboundsexception ("srcbegin> srcend"); System.ArrayCopy (valor, srcbegin, dst, dstbegin, srcend - srcbegin); }El método de append implica el método EnsureCapacityInternal () y el método getChars () para implementarlo
public AbstractStringBuilder append (String Str) {if (str == null) return appendNull (); int len = str.length (); EnsurecapacityInternal (recuento + len); str.getChars (0, len, valor, recuento); recuento += len; devolver esto; }Arrays.copyOf () se utiliza para implementar
void expandcapacity (int mintercapacity) {int newCapacity = value.length * 2 + 2; if (newCapacity - MinimumCapacity <0) NewCapacity = MinimumCapacity; if (newCapacity <0) {if (mínimo de capacidad <0) // desbordamiento tirar nueva outOfMemoryError (); newCapacity = Integer.max_value; } value = arrays.copyOf (valor, newcapacity); }Arrays.fill (valor, recuento, newLength, '/0'); Copiar entre cuerdas
public void setLength (int newLength) {if (newLength <0) tirar nueva StringInDexOutofBoundSException (NewLength); EnsurecapacityInternal (NewLength); if (Count <NewLength) {Arrays.Fill (value, Count, NewLength, '/0'); } count = newLength; }eliminar () solo cambia el tamaño de la cadena y realmente no elimina la cadena
Public AbstractStringBuilder Delete (Int Start, Int End) {if (Start <0) Throw StringInDexOutofBoundSException (inicio); if (end> count) end = count; if (start> end) tire nuevo stringindexutofboundsexception (); int len = end - inicio; if (len> 0) {System.ArrayCopy (valor, inicio+len, valor, inicio, count-end); contar -= len; } devolver esto; }Aprenda a usar de manera flexible el método System.ArrayCopy ()
Public AbstractStringBuilder Insert (int index, char [] str, int offset, int len) {if ((index <0) || (index> longitud ())) arroje nuevo StringInDexOutofBoundSException (index); if ((offset <0) || (len <0) || (offset> str.length - len)) tire nuevo stringindexoUtofBoundsexception ("offset" + offset + ", len" + len + ", str.length" + str.length); EnsurecapacityInternal (recuento + len); System.ArrayCopy (valor, índice, valor, índice + len, count - índice); System.ArrayCopy (str, compensación, valor, índice, len); recuento += len; devolver esto; }Resumir
Lo anterior es todo el contenido de este artículo sobre la interpretación detallada del código fuente del código fuente de clase AbstractStringBuilder. Espero que sea útil para todos. Los amigos interesados pueden continuar referiéndose a otros temas relacionados en este sitio. Si hay alguna deficiencia, deje un mensaje para señalarlo. ¡Gracias amigos por su apoyo para este sitio!