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 не пересчитывается.
Комментариев нет:
Отправить комментарий