суббота, 17 сентября 2016 г.

StringBuilder.ensureCapacity()

StringBuilder sb = new StringBuilder(); // 1
sb.ensureCapacity(100);                 // 2
sb.ensureCapacity(200);                 // 3
sb.ensureCapacity(300);                 // 4
System.out.println(sb.capacity());      // 5

Чему будет равно capacity после выполнения 4-ой строки кода?
Самый популярный ответ - 300. Неправильный!
Верный ответ - 406. Random, подумаете вы? :)

Согласно JLS метод имеет четкий алгоритм, который все объясняет.

Если передаваемое значение меньше текущего capacity, то оно будет пересчитано.
1) Новое capacity станет равным = текущее capacity * 2 + 2
2) Но если полученное значение меньше переданного аргумента, то текущее capacity станет равно переданному значению.

// 1
При создании пустого объекта capacity = 16.

// 2
Далее по алгоритму. Текущее capacity = 16, необходимо умножить его на два и прибавить 2.
16 * 2 + 2 = 34.
Теперь сравним полученное значение с переданным.
34 < 100
Значит, capacity = 100.

// 3
100 * 2 + 2 = 202.
202 больше, чем переданное значение. Значит, capacity станет равным 202.

// 4
202 * 2 + 2 = 406.
406 > 300
Вот почему в 5-ой строчке печатается 406.

Внимание, если передать отрицательное число, то capacity не пересчитывается.

Комментариев нет:

Отправить комментарий