Concatenar cadenas de carácteres

4955 vistas

Es bueno saber cómo Java gestiona las cadenas y las concatenaciones para manipularlas eficientemente.

La clase String:
En Java, a una instancia de la clase String  se le llama nomutable, es decir, que después de ser creada, la cadena no puede ser modificada. Esto es muy práctico en muchas situaciones: es un a tonterÃa, por ejemplo, duplicar una instancia de String para asegurarse que no cambiará (como pasa en C++ por ejemplo). Pero esta propiedad resulta desastrosa con el empleo del operador '+' para concatenar cadenas debido a que cada etapa de la concatenación implica la construcción de una nueva instancia de String.



java
  1. String resultado = ""; // creación de una cadena vacÃa
  2. for( int i=0; i<10; i++) {
  3.   resultado = resultado + i;
  4. }
  5. System.out.println(resultado); // "0123456789"



En la ejecución de este trozo de código, cada iteración del bucle crea una nueva instancia de String, lo que obliga a que la JVM busque memoria para instanciar el nuevo objeto, copiar el contenido de las 2 cadenas y liberar la memoria anterior.

La clase StringBuffer:
La clase java.lang.StringBuffer es una clase que gestiona una cadena modificable. Esta clase se ha creado especialmente para manipular cadenas de carácteres....



java
  1. StringBuffer sb = new StringBuffer(20); // 20 es una estimación de la medida máxima de la cadena
  2. for( int i=0; i<10; i++) {
  3.         sb.append(i);
  4. }
  5. System.out.println(sb.toString()); // "0123456789"



Este trozo de código produce el mismo resultado que el anterior, con la diferencia que éste sólo instancia una sola vez el objeto.


La clase StringBuilder:
Desde J2SE 5.0, también podemos usar la clase StringBuilder (del package java.lang). Su funcionamiento es idéntico al de StringBuffer con la diferencia que éste no es "thread-safe". Si no necesitamos sincronización, mejor usar StringBuilder ya que será más eficiente.

Nota:
Si no se precisa la medida máxima o nos quedamos corto, StringBuffer/StringBuilder recrearán automáticamente la tabla de carácteres para poder albergar todo el texto, pero esto es igual de costoso que la creación de una nueva instancia de String, por lo que es conveniente escoger inicialmente un valor lo suficientemente elevado.