RSS

Las clases de cadena: String, StringBuffer y StringBuilder

27 Mar

Java proporciona tres clases diferentes para tratar con cadenas de caracteres:

Los objetos String son cadenas de caracteres estáticas, al crearse e inicializarse no pueden cambiar su valor. Es porque son inmutables que pueden ser compartidas por varias referencias.

Los objetos StringBuffer y StringBuilder, por el contrario, son cadenas de caracteres dinámicas, pueden cambiar su contenido y su capacidad.

La diferencia entre los objetos StringBuffer y StringBuilder es que los primeros pueden ser utilizados de forma segura por varios hilos, siendo sus métodos sincronizados mientras que los objetos StringBuilder no.

La clase StringBuilder se añadió en la versión J2SE 1.5.


Inmutabilidad en la clase String

Con el siguiente ejemplo, puede parecer que el String saludo sí cambia, pero lo que en realidad sucede es que la referencia se asigna a una nueva cadena creada:

public class Saludo{
    public static void main (String[] args){
        String saludo = "Hola ";
        saludo = saludo + "Rosa";
        System.out.println(saludo);
    }
}

Si no se reasigna la referencia no estamos apuntando a una nueva cadena. Las cadenas que se crean se quedan sin referencia alguna.

Por ejemplo:

public class Saludo2{
    public static void main(String[] args){
        String saludo = "Hola ";
        saludo.concat("Maria");
        saludo.toUpperCase();
        System.out.prinltn(saludo);
    }
}


String Constant Pool

Es una zona especial de memoria en la que se almacena una colección de referencias a objetos String. Se utiliza para mejorar la eficiencia. Al ser los objetos String inmutables se pueden compartir de forma segura por varias referencias y así evitamos crear varios objetos Strings iguales.

Los Strings son objetos y como tales se crean en el Heap. Las referencias en la String Constant Pool apuntan a objetos String vivos en el Heap.

Cuando el compilador se encuentra con un literal String, comprueba si ya existe en el pool un literal igual. Si se encuentra la nueva referencia apunta al String existente.
Si no es así, se crea el nuevo objeto String y se incluye en el pool.
Diferencias al crear un String

Existen diferencias sutiles al crear un String asignando a una referencia un literal y al crear un objeto String utilizando la palabra clave new. En ambos casos supondremos que no existe con anterioridad el String en el pool.

Asignando un literal String:

String nombre = "Lola";

Estamos creando un objeto String Lola y una referencia:


Sin embargo, utilizando la palabra clave new:

String nombre = new String("Lola");

Estamos creando dos objetos y una referencia:



Métodos importantes String

  • charAt(int i): argumento comienza en cero.
  • concat(String s): añade la cadena que se pasa como parámetro.
  • replace(char a, char b): reemplaza el carácter a con el carácter b.
  • substring(int ini, int end): devuelve la subcadena que comienza en ini (empezar en 0) y acaba en end (se cuenta desde 1).
  • trim(): devuelve la cadena sin espacios.
  • length(): devuelve la longitud de la cadena.
  • toLowerCase(): devuelve la cadena en minúsculas.
  • toUpperCase(): devuelve la cadena en mayúsculas.
  • equalsIgnoreCase(String s): devuelve si es igual sin importar mayúscula o minúscula a la cadena que se pasa como parámetro.

Más información sobre la String Constant Pool: Strings, Literally en JavaRanch.

En la siguiente entrada, las clases StringBuffer, StringBuilder y los métodos más usuales.

Anuncios
 
5 comentarios

Publicado por en 27 marzo, 2012 en Tema 6

 

Etiquetas: , , , , , , , , , ,

5 Respuestas a “Las clases de cadena: String, StringBuffer y StringBuilder

  1. ernesto

    8 junio, 2015 at 9:55 pm

    gracias!!

     
  2. Cyberhack

    5 diciembre, 2012 at 9:15 pm

    me ha quedado mas claro este tema..gracias por compartir tus conocimientos adquiridos.

     
    • Virginia Lopez Fernandez

      15 diciembre, 2012 at 10:42 pm

      Gracias! Me alegra, un saludo!

       
  3. aine31

    3 octubre, 2012 at 1:38 pm

    Hola Virginia,

    ante todo felicitarte por el blog y agradecerte el esfuerzo que te has tomado. A mi me está ayudando mucho 🙂

    Hay algo que no me queda claro y quería saber tú opinión.
    Cuando hacemos “new String” se crea un único objeto en el Heap
    o se crean dos objetos en el Heap y una referencia a uno de ellos en el “String Constant Pool”?
    Si se crean dos objetos podrías decirme un caso en el que nos interesase usar el “new” y por qué?

    Entiendo que si sólo se crease un obj. en el Heap nos podría interesar ya que podríamos (eliminando la ref. al objeto) hacerlo elegible por el GC. Pero si se creasen dos obj. y una ref. a uno de ellos en el Pool, entonces no se me ocurre un caso en el que interesase usar “New”.

    Por cierto, no sabrás si hay alguna forma (desde un IDE o con alguna herramienta) de visualizar el “String Constant Pool”?

    Muchas gracias de antemano 😉

     

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

 
A %d blogueros les gusta esto: