Самый просто пример оптимизации
String output = "Some text";
int count = 100;
for(int i =0; i<count; i++) {
output += i;
}
return output;
против
StringBuffer output = new StringBuffer(110);
output.append("Some text");
for(int i =0; i<count; i++) {
output.append(i);
}
return output.toString();
Код делает одно и тоже, но в первом случае при вызове output += i будет каждый раз создаваться новая строка, во втором мы используем один объект. Таким образом в первом случае в памяти будет болтаться 101 строка во втором случае один объект из которого мы можем вытащить строку.