Неизвестное поведение StringBuffer.append()

Странное поведение StringBuffer.append(): javatpoint указывает:

If the number of the character increases from its current capacity, it > increases the capacity by (oldcapacity*2)+2.

Это можно продемонстрировать с помощью следующего кода:

class test {
        public static void main(String[] args) {
                StringBuffer sb = new StringBuffer();

                sb.append("abcdef"); // 16;
                System.out.println(sb.capacity());

                sb.append("1234561711"); // 34
                System.out.println(sb.capacity()); // 34
        }
}

Но это показывает странное поведение в следующем коде:

class test {
        public static void main(String[] args) {
                StringBuffer sb = new StringBuffer();

                sb.append("abcdef"); // 16;
                System.out.println(sb.capacity());

                sb.append("12345617111111111111111111111111111111"); // 44 total 44 character in sb, so capacity should be 70 as it goes from 16, 34, 70, 142 etc.
                System.out.println(sb.capacity()); // 34
        }
}

если мы используем два добавления с указанными выше символами, емкость будет 70! Так что, думаю, ломается только один лимит в одном append()

Не понятно, о чем вы спрашиваете. У вас есть вопрос?

Dawood ibn Kareem 15.07.2019 08:21

Я бы рекомендовал использовать канонический источник документации, например. Javadoc.

Andy Turner 15.07.2019 08:25

Емкость, очевидно, не может быть 34 во втором случае, если общая длина равна 44. ideone.com/Ob76lJ

Andy Turner 15.07.2019 08:27
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Логика StringBufferensureCapacity изложена в Javadoc:

void java.lang.AbstractStringBuilder.ensureCapacity(int minimumCapacity)

Ensures that the capacity is at least equal to the specified minimum.If the current capacity is less than the argument, then a new internal array is allocated with greater capacity. The new capacity is the larger of:

• The minimumCapacity argument.

• Twice the old capacity, plus 2.

Во втором фрагменте 44 (это минимально необходимая емкость, поскольку после второго append в StringBuffer будет 44 символа) больше, чем в два раза по сравнению со старой емкостью, плюс 2 (что равно 34). Следовательно, новая вместимость равна 44.

Другие вопросы по теме