2016-04-03 2 views
0
StringBuilder sbt = new StringBuilder(2);// 
    System.out.print(sbt+"G"); 
    sbt.replace(0,2,"Mano"); 
    System.out.println(sbt+"Length is:"+sbt.capacity()); 

Ожидается, что он должен напечатать GManoLength is:4.Как заменить строковый конструктор?

Но она возвращает GManoLength is:6

Как это работает распределение?

Я прочитал this

ответ

0

StringBuilder хранит данные в массиве char[] под капотом и capacity() метод возвращает длину этого массива (не длина приложенных значений).

Когда емкость достигнута и вы хотите добавить больше значений, массив должен быть расширен. Это хорошая идея, чтобы дать дополнительное пространство во время этого процесса и не делать расширение, после каждого добавления (это дорогостоящая операция):

int newCapacity = value.length * 2 + 2;//called when capacity is reached during append 

так capacity всегда больше или равно, то длина фактических данных (это значение может быть получено с помощью вызова метода length())

2

Вы не показывая длину из содержимого StringBuilder. Вы показываете вместимости. StringBuilder может выделять сколько угодно пространства, даже если вы никогда не используете это пространство. Обычно разумно предположить, что StringBuilder будет использоваться для добавления в него большего количества данных, иначе вы бы использовали строковую или другую конструкцию с постоянным размером.

Если вы хотите показать длину данных, используйте метод length().

0

При попытке добавить этот 4-х символов «Mano» в StrigBuilder емкости 2, метод expandCapacity из AbstractStringBuilder будет называться с minimumCapacity как MinimumSize необходимо выделить новую строку:

void expandCapacity(int minimumCapacity) { 
    int newCapacity = value.length * 2 + 2; 
    if (newCapacity - minimumCapacity < 0) 
     newCapacity = minimumCapacity; 
    if (newCapacity < 0) { 
     if (minimumCapacity < 0) // overflow 
      throw new OutOfMemoryError(); 
     newCapacity = Integer.MAX_VALUE; 
    } 
    value = Arrays.copyOf(value, newCapacity); 
} 

Первое, что он пытается сделать, это удвоить текущую емкость и сумму 2. Ваша первоначальная емкость равна 2, поэтому newCapacity будет 6. Это больше, чем 4 (длина «Мано»), поэтому именно поэтому вы см. 6.

Смежные вопросы