# Programación en Java/La clase String

Un valor de tipo cadena, es tratado internamente por el compilador como una secuencia de caracteres, por esta razón muchos métodos de la clase String pueden acceder a los valores de la cadena por medio de sus indices. Un valor de tipo cadena pertenece a la clase String , es decir, es una instancia de la clase String , por lo que la variable que se cree con un valor de tipo cadena, podrá acceder a los métodos de la clase String. Para crear un objeto de tipo String ahí dos maneras básicas de hacerlo, la primera es por medio de la asignación a una variable de tipo String de un literal.
String cadena = "hola";
El literal de cadena es una expresión constante por lo que su valor es internado en una sección de la memoria que administra la JVM llamado run-time constant pool , que almacena valores constantes de distinto tipo , esto significa que un literal String siempre hará referencia a la misma instancia de la clase String que fue agregada al pool, en esta ocasión el valor "hola" fue internado al pool por la JVM y devuelve una referencia a esa instancia a la variable cadena. Si declaramos otra variable con el mismo valor "hola", no se crearía un nuevo objeto String, sino que la JVM vería en el pool si ya esta internado ese valor constante y le asignaría una copia a esa instancia ya creada, no reservaría espacio en memoria para un nuevo objeto String. Para que quede mas claro la forma en que el compilador maneja los literales String veamos el siguiente código, que demuestra que ambas variable hacen referencia a la misma instancia de la clase String creada por un literal:
String cadena = "hola";
String cadena2 = "hola";
System.out.println(cadena == cadena2);
La salida sería:
true
Cuando creamos una referencia a un objeto String, llamando al constructor de la clase, entonces sí creamos un nuevo objeto en el heap de la memoria, con su propia dirección y espacio reservado, si le asignáramos el mismo valor a dos variables String distintas veríamos la diferencia:
//Se crea referencia a objeto String por valor literal
String cadena = "hola";
//Se crea referencia a objeto String llamando al constructor de la clase
String cadena2 = new String("hola");
//Al realizar la comparación de ambas referencias vemos que son distintas, a diferencia del ejemplo anterior
System.out.println(cadena == cadena2);
La salida sería:
false
Para que aún quede más claro el funcionamiento en memoria de los objetos String, si creamos dos variables String con el mismo valor, llamando al constructor de la clase, cada una haría referencia a objetos distintos con su propio espacio en memoria reservado en el área del heap, como sería el comportamiento de cualquier objeto que es creado instanciandolo con el operador new.
String cadena = new String("hola");
String cadena2 = new String("hola");
System.out.println(cadena == cadena2);
La salida sería:
false
La se String nos permite con todos sus métodos el manejo de cadenas de caracteres de forma facil.
Un String no es más que un array de caracteres. He aqui un ejemplo de creación de un String a partir de un array de caracteres:

## Constructores

Los más utilizados son:
Constructor por defecto:
Crea un objeto de tipo String y lo inicializa a "vacio".
Es un constructor que recibe como parámetro una cadena de texto, guardándola en la variable (da igual el tamaño de dicha cadena).

## Métodos

Algunos de los métodos más utilizados son:
Método charAt, que recibe un entero como parámetro y devuelve el carácter que ocupe dicha posición en el objeto String que lo invoque.
Ejemplo con el String s de los ejemplos del constructor:
En la variable a, quedaría guardado el carácter 'x'.

## Enlaces

Puedes consultar esta clase en el manual original en ingles aquí