Začátečníka láká použít pro spojování řetězců operátor +, a to i v případě, že se za existující řetězec připojují další znaky či řetězce nebo se zřetězení dokonce opakuje v cyklu.
Co však zřetězení s = s + " novy";
udělá?
Má s
jako odkaz na objekt s původním
řetězcem, " novy"
jako literál / hotový řetězec v
paměti.
Vytvoří nový řetězec jako prázdný
StringBuilder
,
ty původní (s
a " novy"
)
do něj přikopíruje.
Převede StringBuilder
na
String
.
Původní objekt s
se "zapomene".
A toto provádět v cyklu? To je trochu moc operací, ne!?
První příklad na Java Anti-patterns také ukazuje tuto extrémně neefektivní konstrukci.
Něco jako s += " novy"
sice vypadá hezky, ale v
tomto ohledu vůbec nepomůže. Jediným rozumným řešením je v cyklu použití
StringBuilderu (příp. StringBufferu):
StringBuilder sb = new StringBuilder(persons.size() * 16); // well estimated buffer
for (Person p : persons) {
sb.append(p.getName);
}