Да, умножения размера карты на ожидаемый (предполагаемый) средний размер списка и на ожидаемую (предполагаемую) среднюю длину строки должно быть достаточно.
Алгоритм роста StringBuilder не является линейным: он удваивается каждый раз, поэтому вы не получите большого выигрыша от точной оценки его окончательного размера.
Я сомневаюсь, что именно здесь у вас возникнут проблемы с производительностью.
Примечание: ваш код будет проще, если вы добавляете новую строку перед каждым элементом, кроме первого, и используете синтаксис цикла foreach. Вы должны также выполнить итерацию по entrySet()
карты, а не выполнять итерации по ключам и выполнять поиск на каждой итерации:
boolean isFirst = true;
for (Map.Entry<String, List<String>> entry : warningMap.entrySet()) {
List<String> warnings = entry.getValue();
if (warnings != null) {
for (String warning : warnings) {
if (!isFirst) {
warningMessages.append(NEW_LINE);
}
isFirst = false;
warningMessages.append(warning);
}
}
}