Apuntes Java: Strings

La clase String

En Java no existe un tipo de datos primitivo que sirva para la manipulación de cadenas de caracteres. En su lugar se utiliza una clase definida en el API que es la clase String. Esto significa que en Java las cadenas de caracteres son, a todos los efectos, objetos que se manipulan como tales, aunque existen ciertas operaciones, como la creación de Strings, para los que el lenguaje tiene soporte directo, con lo que se simplifican algunas operaciones.

La clase String forma parte del package java.lang y se describe completamente en la documentación del API del JDK.

Creación de Strings

Un String puede crearse como se crea cualquier otro objeto de cualquier clase; mediante el operador new:

String s = new String("Esto es una cadena de caracteres");

Los literales de cadena de caracteres se indican entre comillas dobles ("), a diferencia de los caracteres, que utilizan comillas simples (').

Sin embargo también es posible crear un String directamente, sin usar el operador new, haciendo una asignación simple (como si se tratara de un dato primitivo):

String s = "Esto es una cadena de caracteres";

Ambas expresiones conducen al mismo objeto.

Los Strings no se modifican una vez que se les ha asignado valor. Si se produce una reasignación se crea un nuevo objeto String con el nuevo contenido.

Además la clase String proporciona constructores para crear Strings a partir de arrays de caracteres y arrays de bytes.

Concatenación de Strings

Java define el operador + (suma) con un significado especial cuando las operandos son de tipo String. En este caso el operador suma significa concatenación. El resultado de la concatenación es un nuevo String compuesto por las dos cadenas, una tras otra. Por ejemplo:

String x = "Concatenar" + "Cadenas";

da como resultado el String "ConcatenarCadenas".

También es posible concatenar a un String datos primitivos, tanto numéricos como booleanos y char. Por ejemplo, se puede usar:

int i = 5;
String x = "El valor de i es " + i;

Cuando se usa el operador + y una de las variables de la expresión es un String, Java transforma la otra variable (si es de tipo primitivo) en un String y las concatena. Si la otra variable es una referencia a un objeto entonces invoca el método toString() que existe en todas las clases (es un método de la clase Object).

Otros métodos de la clase String

La clase String dispone de una amplia gama de métodos para la manipulación de las cadenas de caracteres. Para una referencia completa consultar la documentación del API del JDK. El siguiente cuadro muestra un resumen con algunos de los métodos más significativos:

Método Descripción
char charAt(int index) Devuelve el carácter en la posición indicada por index. El rango de index va de 0 a length() - 1.
boolean equals(Object obj) Compara el String con el objeto especificado. El resultado es true si y solo si el argumento es no nulo y es un objeto String que contiene la misma secuencia de caracteres.
boolean equalsIgnoreCase(String s) Compara el String con otro, ignorando consideraciones de mayúsculas y minúsculas. Los dos Strings se consideran iguales si tienen la misma longitud y, los caracteres correspondientes en ambos Strings son iguales sin tener en cuenta mayúsculas y minúsculas.
int indexOf(char c) Devuelve el indice donde se produce la primera aparición de c. Devuelve -1 si c no está en el string.
int indexOf(String s) Igual que el anterior pero buscando la subcadena representada por s.
int length() Devuelve la longitud del String (número de caracteres)
String substring(int begin, int end) Devuelve un substring desde el índice begin hasta el end
static String valueOf(int i) Devuelve un string que es la representación del entero i. Observese que este método es estático. Hay métodos equivalentes donde el argumento es un float, double, etc.
char[] toCharArray()
String toLowerCase()
String toUpperCase()
Transforman el string en un array de caracteres, o a mayúsculas o a minúsculas.

La clase StringBuffer

Dado que la clase String sólo manipula cadenas de caracteres constantes resulta poco conveniente cuando se precisa manipular intensivamente cadenas (reemplazando caracteres, añadiendo o suprimiendo, etc.). Cuando esto es necesario puede usarse la clase StringBuffer definida también en el package java.lang. del API. Esta clase implanta un buffer dinámico y tiene métodos que permiten su manipulación cómodamente. Ver la documentación del API.

Ejemplo

Un número capicúa es aquel que se lee igual de derecha a izquierda que de izquierda a derecha. Vamos a mostrar un ejemplo de un método que determina si un número es capicúa o no.

public boolean esCapicua(long n) {
    String ns = String.valueOf(n); // Devuelve un String con la representación del valor de n
    int ultimo = ns.length() - 1; // El primer caracter tiene el índice 0, el segundo 1, etc, y el último la long. del String -1
    int medio = ns.length() / 2; // Recorreremos el String desde el comienzo hasta la mitad (entera)
    for (int i = 0 ; i < medio; i++) { Recorremos el String comparando cada caracter con su opuesto. 
        char c1 = ns.charAt(i); // El carácter en la mitad izquierda.
        char c2 = ns.charAt(ultimo - i); // El carácter en la mitad derecha.
        if (c1 != c2) return false; // Si no son iguales es que no es capicúa.
    } 
    return true; // hemos recorrido todo el String y todos los carácteres han resultado iguales a sus opuestos. 
 }

Y podríamos usar el método de la siguiente forma:

long n = 123454321;
boolean resultado = esCapicua(n);
String r = " no es ";
if (resultado) r = " es ";
System.out.println("El número " + n + r + " capicúa");

que produciría la salida:

El número 123454321 es capicúa

Un palíndromo es una palabra o frase que, al igual que un número capicúa puede leerse igual al derecho que al revés. ¿Podrías escribir un fragmento de código que determinara si un String (una palabra o una frase) es un palíndromo? Una palabra que es un palíndromo es, por ejemplo, Reconocer. Y una frase completa que es palíndormo es, por ejemplo: Ana lava lana. Ten presente que en una frase hay espacios en blanco que no se tienen en cuenta para determinar si es un palíndromo o no, y las mayúsculas y minúsculas tampoco son significativas.

Última actualización: 10/11/2016