Я заметил что capacity
возвраты метода StringBuilder
способность без логического пути... когда-то его значение, равняется длине строки другому времени, это больше...
существует ли уравнение для, знают, который является его логикой?
Когда вы добавляете StringBuilder
, происходит следующая логика:
if (newCount > value.length) {
expandCapacity(newCount);
}
, где newCount
- необходимое количество символов, а value.length
- текущий размер буфера.
expandCapacity
просто увеличивает размер подложки char []
Метод sureCapacity ()
- это общедоступный способ вызова expandCapacity ()
, и его документы говорят:
Гарантирует, что емкость, по крайней мере, равна указанному минимуму. Если текущая емкость меньше аргумента, то выделяется новый внутренний массив с большей емкостью. Новая емкость больше:
- Аргумент минимальной емкости.
- В два раза больше старой емкости плюс 2.
Если аргумент minimumCapacity не положителен, этот метод не выполняет никаких действий и просто возвращает.
Эта функция делает нечто иное, чем вы ожидаете - она выдает максимальное количество символов, которое может вместить память экземпляра StringBuilder в данный момент.
РЕДАКТИРОВАТЬ: Извинения - ниже представлена информация о StringBuilder .NET, которая не имеет прямого отношения к исходному вопросу.
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
, который поставляется с JDK. (Приведенные выше фрагменты взяты из JDK 1.6)