Veamos el siguiente ejemplo.

String s = "";

for (Persona p : personas) {
s += ", " + p.getNombre();
}
s = s.substring(2); //Quita la primera coma

Este código muestra un ejemplo claro de una mala práctica que puede afectar el rendimiento óptimo de una aplicación, su tiempo de ejecución es de orden aproximado O(personas.length²). La concatenación repetitiva de cadenas en ciclos causa exceso de basura y copiado de arreglos. Además es necesario remover la última coma, lo cual es evidentemente un parte fea del código.

La siguiente sería una mejor práctica:

StringBuilder sb = new StringBuilder(personas.size() * 16); // Con una estimacion inicial del tamaño del buffer

for (Persona p : personas) {
if (sb.length() > 0) sb.append(", ");
sb.append(p.getNombre);
}

Que incluye además una estimación inicial del tamaño del buffer.