En Java, la clase String es inmutable: en cualquier operación de modificación, se crea un nuevo objeto. Las clases StringBuilder y StringBuffer son mutables, se utilizan para concatenaciones dentro de ciclos y transformaciones complejas.
Diferencias clave:
String: inmutable, seguro para hilos sin sincronización adicional. Ideal para texto legible e inmutable (por ejemplo, claves, mensajes).StringBuilder: mutable, no seguro para hilos, pero concatenación rápida. Se utiliza donde las cadenas cambian muchas veces.StringBuffer: mutable, seguro para hilos (métodos sincronizados), pero inferior en rendimiento a StringBuilder.Ejemplo de comparación de velocidad:
String s = ""; for (int i = 0; i < 10000; i++) { s += i; // crea un nuevo String cada vez, ¡lento! } // Mejor así: StringBuilder sb = new StringBuilder(); for (int i = 0; i < 10000; i++) { sb.append(i); } String result = sb.toString();
Trampas:
String.intern() puede causar OutOfMemoryError en PermGen/Metaspace con una gran cantidad de cadenas únicas.Pregunta: "¿Es eficiente la concatenación de cadenas con el operador "+" dentro de un ciclo?"
Respuesta: No, cada vez se crea un nuevo objeto String, lo que carga mucho la memoria y el GC. Para múltiples operaciones, es mejor usar StringBuilder o StringBuffer (si se requiere seguridad para hilos).
Ejemplo:
String s = ""; for (int i = 0; i < 1000; i++) { s += i; // ¡MUY ineficiente! } // vs StringBuilder sb = new StringBuilder(); for (int i = 0; i < 1000; i++) { sb.append(i); }
Historia
En un proyecto bancario, la concatenación de cadenas con el operador "+" en un gran ciclo ralentizó el análisis nocturno en 15 veces. El problema se resolvió reemplazándolo por StringBuilder, el tiempo de ejecución se redujo de 40 minutos a 2.
Historia
Un joven desarrollador cometió un error con los hilos y utilizó StringBuilder en el mismo objeto fachada, al que accedían simultáneamente varios hilos. Esto llevó a bloqueos aleatorios y resultados incorrectos debido a la falta de sincronización.
Historia
En el proyecto se creaban etiquetas únicas utilizando String.intern(). Con el aumento de usuarios a decenas de millones, la JVM comenzó a lanzar OutOfMemoryError: PermGen space. Se decidió eliminar el uso de intern() y pasar a otros mecanismos de almacenamiento en caché.