ovšem ke skrytému vytvoření nového objektu dojít ve skutečnosti může a skutečně i několikrát dojde – přijdete na to, kde a proč?
Asi tady
str.append(i);
str.append(' ');
a tady
return str.toString();
V prvním případě kvůli občasné realokaci velikostí již nedostačujícího StringBufferu str
(alokace nového bufferu, kopie z původního místa, úprava referencí, uvolnění původního objektu), v druhém jednorázová konverze StringBuffer -> String.
Ano presne - k realokacim StringBufferu|Builderu bude dochazet ve smycce, protoze puvodni velikost je pro sestnact znaku.
A str.toString() udela defenzivni kopii retezce, aby se pole znaku StringBufferu|Builderu nesdilelo - to je dulezite, protoze kdyby se vratilo interni pole StringBufferu|Builderu jako podle specifikace nemenny retezec, mohl by nekdo zmenou ve StringBufferu|Builderu dosahnou i zmeny v "nemenitelnem" Stringu ;-)