Потому что, глядя на исходный код StringBuffer и StringBuilder, было обнаружено, что как унаследован, и многие методы являются методами AbstractStringBuilder, поэтому я решил сначала посмотреть на исходный код AbstractStringBuilder, а затем посмотрите на StringBuffer и StringBuilder.
Расположение: в пакете java.lang
Заявление: абстрактный класс AbstractStringBuilderImplomements Приложение, Charsequence
Класс AbstractStringBuilder имеет абстрактную модификацию, которая показывает, что его нельзя создать.
Класс AbstractStringBuilder имеет два подкласса: StringBuilder и StringBuffer.
Поля
/*** Значение используется для хранения символов. */ char value []; /*** Подсчет - это количество используемых символов. */ int count;
Конструктор
1. Конструктор без параметра
AbstractStringBuilder () {}2. При создании объекта класса реализации AbstractStringBuilder укажите размер буфера для емкости.
AbstractStringBuilder (int емкость) {value = new char [емкость]; }Когда подкласс StringBuilder или StringBuffer создается, этот конструктор вызывается в конструкторе.
Расширить емкость
void expandCapacity(int minimumCapacity)
Этот метод имеет разрешения на доступ к пакетам, и несколько методов в классе будут вызывать этот метод для расширения емкости, когда емкость недостаточно.
Исходный код:
void expandCapacity (int MinimumCapacity) {int newCapacity = (value.length + 1) * 2; if (newcapacity <0) {newcapacity = integer.max_value; } else if (minimumcapacity> newcapacity) {newcapacity = minimumcapacity; } value = arrays.copyof (value, newcapacity); }Добавьте длину буфера на 1 на 2 в переменную newcapacity, затем сравните это значение с указанным значением и определите большее значение как новую емкость буфера; Затем вызовите метод копии класса массивов, который создает новый массив, а затем скопируйте все символы в оригинальном массиве в новый массив.
EncureCapacity (int MinimumCapacity)
Public void EnsureCapacity (int MinimumCapacity)
Убедитесь, что емкость, по крайней мере, равна указанному минимальному значению. Если текущая емкость меньше указанного значения, создается новый массив, а емкость нового массива вдвое превышает указанное значение плюс 2; Если текущая емкость не меньше указанного значения, обработка не выполняется напрямую.
Исходный код:
public void EnsureCapacity (int MinimumCapacity) {if (MinimumCapacity> value.length) {expandCapacity (MinimumCapacity); }}тест:
StringBuffer s = new StringBuffer (); System.out.println ("емкость:" + s.capacity ()); // емкость: 16 s.senurecapacity (10); System.out.println ("емкость:" + s.capacity ()); // емкость: 16 s.senurecapacity (30); System.out.println ("емкость:" + s.capacity ()); // емкость: 34 s.senurecapacity (80); System.out.println ("емкость:" + s.capacity ()); // емкость: 80метод
Метод CodePointat реализован с использованием символа. Codepointatimpl (значение, индекс, Count)
public int codePointat (int index) {if ((index <0) || (index> = count)) {бросить новый stringIndexoutOfBoundSexception (index); } return parmate.codepointatimpl (значение, индекс, count); }Метод GetChars реализован с использованием метода System.ArrayCopy ()
public void getChars (int srcbegin, int srcend, char [] dst, int dstbegin) {if (srcbegin <0) выбрать новый stringIndexoutOfBoundsexception (srcbegin); if ((srcend <0) || (srcend> count)) бросить новый stringIndexoutOfBoundSexception (srcend); if (srcbegin> srcend) бросить новый stringIndexoutOfBoundSexception ("srcbegin> srcend"); System.ArrayCopy (Value, Srcbegin, DST, DSTBEGIN, SRCEND - SRCBEGIN); }Метод добавления включает метод EncureCapacityInternal () и метод getChars () для его реализации
public AbstractStringBuilder Append (String Str) {if (str == null) return appendnull (); int len = str.length (); EnsureCapacityInternal (Count + Len); str.getchars (0, len, значение, граф); count += len; вернуть это; }Arrays.copyof () используется для реализации
void expandCapacity (int MinimumCapacity) {int newCapacity = value.length * 2 + 2; if (newcapacity - minimumcapacity <0) newcapacity = minimumcapacity; if (newcapacity <0) {if (minimumcapacity <0) // переполнить новый OutofmemoryError (); newCapacity = integer.max_value; } value = arrays.copyof (value, newcapacity); }Arrays.fill (значение, count, newlength, '/0'); Копия между струнами
public void setlength (int newlength) {if (newLength <0) бросить новый stringIndexoutofboundsexception (newLength); EncureCapacityInternal (NewLength); if (count <newlength) {arrays.fill (значение, count, newlength, '/0'); } count = newlength; }delete () только изменяет размер строки и на самом деле не удаляет строку
public AbstractStringBuilder delete (int start, int end) {if (start <0) бросить новый stringIndexoutofboundsexception (start); if (end> count) end = count; if (start> end) бросить новый stringIndexoutofboundsexception (); int len = end - start; if (len> 0) {System.ArrayCopy (значение, start+len, value, start, count-end); count -= len; } вернуть это; }Научитесь гибко использовать метод System.ArrayCopy ()
Public AbstractStringBuilder INSERT (int index, char [] str, int offset, int len) {if ((index <0) || (index> length ())) бросить новый stringIndexoutofboundsexception (index); if ((Offset <0) || (Len <0) || (Offset> str.length - len)) бросить новый stringIndexoutOfBoundSexception («смещение» + смещение + », len» + len + ", str.length" + str.length); EnsureCapacityInternal (Count + Len); System.ArrayCopy (значение, индекс, значение, индекс + len, count - index); System.ArrayCopy (str, смещение, значение, индекс, Len); count += len; вернуть это; }Суммировать
Выше приведено все содержание этой статьи о подробной интерпретации исходного кода исходного кода класса AbstractStringBuilder. Я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!