Емкость StringBuilder ()

Я заметил, что метод capacity возвращает емкость StringBuilder без логического пути … когда-то его значение равно длине строки, в другое время это больше …

есть ли уравнение для знания, которое является его логикой?

    Когда вы добавляете к StringBuilder , происходит следующая логика:

     if (newCount > value.length) { expandCapacity(newCount); } 

    где newCount – количество требуемых символов, а value.length – текущий размер буфера.

    expandCapacity просто увеличивает размер подложки char[]

    Метод ensureCapacity() – это общеansible способ вызова expandCapacity() , и его документы говорят:

    Обеспечивает, чтобы емкость была как минимум равна указанному минимуму. Если текущая емкость меньше аргумента, то новый внутренний массив выделяется с большей пропускной способностью. Новая емкость больше:

    • Аргумент minimumCapacity.
    • Дважды старая емкость, плюс 2.

    Если аргумент minimumCapacity неположителен, этот метод не принимает никаких действий и просто возвращает.

    Я попытаюсь объяснить это с помощью некоторого примера.

     public class StringBuilderDemo { public static void main(String[] args) { StringBuilder sb = new StringBuilder(); System.out.println(sb.length()); System.out.println(sb.capacity()); } } 

    length() – длина последовательности символов в построителе, так как этот stringbuilder не содержит никакого содержимого, его длина будет равна 0.

    capacity() – количество выделенных пространств символов. Когда вы пытаетесь построить stringbuilder с пустым содержимым, по умолчанию он принимает размер инициализации как length + 16, который равен 0 + 16. поэтому емкость вернет здесь 16.

    Примечание. Емкость, возвращаемая методом capacity (), всегда больше или равна длине (обычно больше) и будет автоматически расширяться по мере необходимости для дополнения дополнений к построителю строк.

    Логика функции емкости:

    1. Если вы не инициализируете stringbuilder каким-либо контентом, емкость по умолчанию будет равна 16 символам.
    2. Если вы инициализируете stringbuilder любым контентом, тогда емкость будет содержать длину + 16.
    3. Когда вы добавляете новый контент в объект stringbuilder, если текущая емкость недостаточна для получения нового значения, тогда она будет увеличиваться на (предыдущая емкость массива + 1) * 2.

    Этот анализ берется из фактического кода StringBuilder.java

    Эта функция делает что-то другое, чем вы ожидаете, – это дает вам максимальное количество символов, которые может храниться в памяти экземпляра StringBuilder.

    Строковый строитель должен читать

    EDIT: Извинения. Ниже приведена информация о .NET StringBuilder и не имеет строгого отношения к исходному вопросу.

    http://johnnycoder.com/blog/2009/01/05/stringbuilder-required-capacity-algorithm/

    StringBuilder выделяет пространство для подстрок, которые вы могли бы добавить к нему (так же, как List создает пространство, которое он обертывает). Если вам нужна фактическая длина строки, используйте StringBuilder.Length.

    Из API:

    Каждый построитель строк имеет емкость. Пока длина символьной последовательности, содержащейся в построителе строк, не превышает емкость, нет необходимости выделять новый внутренний буфер. Если внутренний буфер переполняется, он автоматически становится больше.

    Всякий раз, когда вы добавляете что-то, есть проверка, чтобы убедиться, что обновленный StringBuilder не будет превышать его емкость, и если это произойдет, внутреннее хранилище StringBuilder будет изменено:

     int len = str.length(); int newCount = count + len; if (newCount > value.length) expandCapacity(newCount); 

    Когда к нему добавляются данные, превышающие его емкость, он изменяется в соответствии со следующей формулой:

     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); } 

    Дополнительную информацию см. src.zip файле src.zip который поставляется вместе с JDK. (Над fragmentами, взятыми из 1.6 JDK)

    Вот логика: если вы определяете новый экземпляр classа StringBuilder без конструктора, например new StringBuilder(); по умолчанию – 16. Конструктор может быть либо int либо String . Для конструктора String по умолчанию рассчитывается следующим образом:

     int newCapacity = string.length() + 16; 

    Для конструктора int мощность вычисляется следующим образом:

     int newCapacity = intSpecified + 16; 

    Если к String добавляется новая String а новая длина String больше текущей емкости, тогда емкость вычисляется следующим образом:

     int newCapacity = (oldCapacity + 1) * 2; 

    Вы можете войти в код JDK и посмотреть, как он работает, он основан на массиве char: new char[capacity] , он похож на то, как работает ArrayList ( когда использовать LinkedList над ArrayList? ). Оба используют массивы как «эффективные аппаратные средства», трюк состоит в том, чтобы выделить большой кусок памяти и работать в нем до тех пор, пока у вас не закончится память, и для продолжения (расширения / роста) потребуется следующий большой кусок.

    Давайте будем гением компьютера.