Способность StringBuilder ()

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

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

15
задан xdevel2000 6 July 2010 в 07:17
поделиться

4 ответа

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

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

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

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

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

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

  • Аргумент минимальной емкости.
  • В два раза больше старой емкости плюс 2.

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

13
ответ дан 1 December 2019 в 01:53
поделиться

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

String Builder must read

4
ответ дан 1 December 2019 в 01:53
поделиться

РЕДАКТИРОВАТЬ: Извинения - ниже представлена ​​информация о StringBuilder .NET, которая не имеет прямого отношения к исходному вопросу.

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

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

1
ответ дан 1 December 2019 в 01:53
поделиться

Из 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, который поставляется с JDK. (Приведенные выше фрагменты взяты из JDK 1.6)

1
ответ дан 1 December 2019 в 01:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: