Java tiene varios mecanismos para trabajar con cadenas de texto. Estas se pueden clasificar en cadenas inmutables (con String
) y cadenas modificables (con StringBuilder
y StringBuffer
).
A) Cadenas Inmutables – Clase String
Una cadena String
en Java es inmutable. Esto significa que una vez creada, su contenido no puede cambiar. Cada vez que realizas una operación sobre una cadena (como concatenar, reemplazar, etc.), Java crea un nuevo objeto String en memoria, y el anterior no se modifica.
📌 Ejemplo:
String saludo = "Hola";
saludo = saludo + " mundo"; // Se crea un nuevo String con "Hola mundo"
➡ Aunque parezca que modificaste la cadena saludo
, en realidad estás creando una nueva cadena y reasignándola a la variable.
1. Concatenación de cadenas
1.1 Unión de cadenas (+
y concat()
)
Puedes unir dos o más cadenas para formar una sola.
Ejemplo:
String nombre = "Juan";
String saludo = "Hola " + nombre; // Usando +
System.out.println(saludo); // Hola Juan
También puedes usar el método concat()
:
String saludo = "Hola ".concat("Mundo");
System.out.println(saludo); // Hola Mundo
1.2 Concatenación con otros tipos (números, objetos)
Si concatenas una cadena con un número u objeto, Java convierte automáticamente el valor a texto usando toString()
.
Ejemplo:
int edad = 25;
String mensaje = "Tienes " + edad + " años.";
System.out.println(mensaje); // Tienes 25 años.
2. Manipulación y búsqueda de texto
2.1 Acceso a caracteres y extracción de subcadenas
length()
→ Devuelve cuántos caracteres tiene la cadena.charAt(int index)
→ Devuelve el carácter en la posición indicada (índice inicia en 0).substring(inicio)
→ Devuelve desde esa posición hasta el final.substring(inicio, fin)
→ Devuelve desde inicio hasta fin-1.
Ejemplo:
String palabra = "Programación";
System.out.println(palabra.length()); // 12
System.out.println(palabra.charAt(0)); // 'P'
System.out.println(palabra.substring(0, 7)); // "Program"
System.out.println(palabra.substring(7)); // "ación"
2.2 Búsqueda en cadenas
indexOf("texto")
: posición donde comienza una subcadena (o -1 si no la encuentra).contains("texto")
: devuelvetrue
si contiene el texto.startsWith("texto")
:true
si la cadena comienza con ese texto.endsWith("texto")
:true
si termina con ese texto.
Ejemplo:
String frase = "La programación es divertida";
System.out.println(frase.indexOf("es")); // 18
System.out.println(frase.contains("diver")); // true
System.out.println(frase.startsWith("La")); // true
System.out.println(frase.endsWith("divertida")); // true
3. Conversión entre texto y números
De número a cadena (valueOf
, toString()
):
int numero = 42;
String texto = String.valueOf(numero); // "42"
De cadena a número (parseInt
, parseDouble
…):
String cadena = "100";
int num = Integer.parseInt(cadena); // 100
⚠️ Si la cadena no contiene un número válido, se lanza una excepción NumberFormatException
.
4. Formateo de texto con String.format()
El método String.format()
permite crear cadenas con valores variables usando un formato específico.
Es muy similar a System.out.printf()
, pero en vez de imprimir, devuelve una cadena formateada.
Símbolos de formato:
- %s → Cadena de texto (String) (Ej: “Ana”)
- %d → Número entero (int, long) (Ej: 25)
- %f → Número decimal (float, double) (Ej: 3.14, 2.71828)
- %.2f → Decimal con 2 cifras (Ej: 3.14)
- %n → Salto de línea (como \n)
Ejemplo:
String nombre = "Ana";
int edad = 28;
String info = String.format("Nombre: %s - Edad: %d", nombre, edad);
System.out.println(info); // Nombre: Ana - Edad: 28
Otro ejemplo con decimales
double precio = 12.5;
String producto = "Café";
String factura = String.format("Producto: %s | Precio: %.2f €", producto, precio);
System.out.println(factura);
// Salida: Producto: Café | Precio: 12.50
5. Comparación de cadenas
Métodos:
equals(String)
: compara si dos cadenas son idénticas (respeta mayúsculas/minúsculas).equalsIgnoreCase(String)
: igual queequals
, pero ignora diferencias de mayúsculas.compareTo(String)
: compara alfabéticamente. Devuelve:- 0 si son iguales
- < 0 si es menor
- 0 si es mayor
compareToIgnoreCase(String)
: igual pero ignora mayúsculas.
Ejemplo:
String a = "Casa";
String b = "casa";
System.out.println(a.equals(b)); // false
System.out.println(a.equalsIgnoreCase(b)); // true
System.out.println(a.compareTo("Casa")); // 0
System.out.println(a.compareToIgnoreCase("cAsA")); // 0
6. Transformación de texto
trim()
: elimina espacios al inicio y final.toLowerCase()
/toUpperCase()
: cambia a minúsculas o mayúsculas.replace("a", "b")
: reemplaza caracteres o texto.
Ejemplo:
String cadena = " Hola Mundo ";
System.out.println(cadena.trim()); // "Hola Mundo"
System.out.println(cadena.toLowerCase()); // " hola mundo "
System.out.println(cadena.toUpperCase()); // " HOLA MUNDO "
System.out.println(cadena.replace("o", "0")); // " H0la Mund0 "
B) Cadenas Modificables – StringBuilder
y StringBuffer
Cuando usas la clase String
, cada vez que modificas una cadena (como al concatenar), se crea un nuevo objeto String en memoria. Si haces muchas modificaciones (por ejemplo, en un bucle), esto puede ser ineficiente y consumir mucha memoria.
Para resolver este problema, Java proporciona dos clases que permiten modificar cadenas de forma eficiente, sin crear nuevos objetos: StringBuilder
y StringBuffer
. Tanto StringBuilder
como StringBuffer
son excelentes opciones cuando necesitas modificar cadenas frecuentemente. Úsalos cuando notes que tu código hace muchas concatenaciones dentro de bucles o métodos repetitivos.
StringBuilder
No es sincronizado → más rápido, pero no seguro en entornos multihilo.
Métodos útiles de StringBuilder:
- append(String): Añade texto al final de la cadena
- insert(int pos, txt): Inserta texto en una posición específica
- replace(inicio, fin, txt): Reemplaza una parte del texto
- delete(inicio, fin): Elimina una parte del texto
- reverse(): Invierte el texto
- toString(): Convierte el StringBuilder en un String
Ejemplo:
StringBuilder sb = new StringBuilder("Hola");
sb.append(" mundo"); // Agrega " mundo" al final (sb = "Hola mundo")
sb.insert(5, "Java "); // Inserta "Java " en la posición 5 (sb = "Hola Java mundo")
sb.replace(5, 9, "Programar "); // Reemplaza "Java" por "Programar " (sb = "Hola Programar mundo")
sb.delete(0, 5); // Elimina "Hola " (sb = "Programar mundo")
sb.reverse(); // Invierte todo (sb = "odnum raromargorP")
StringBuffer
Es igual que StringBuilder
, pero es seguro para uso con múltiples hilos (sincronizado).
StringBuffer sbf = new StringBuffer("Hola");
sbf.append(" a todos");
System.out.println(sbf); // Hola a todos
Actividades de programación
Actividad 1: Contar las Vocales en una Cadena
Crear un programa que reciba una cadena de texto y cuente cuántas vocales (a, e, i, o, u) contiene.
- Solicitar al usuario que ingrese una cadena de texto.
- Iterar sobre cada carácter de la cadena.
- Contar cuántas vocales aparecen en la cadena.
- Imprimir el resultado.
Ejemplo:
String cad = "Programación";
// Debería imprimir: "El número de vocales es: 5"
import java.util.Scanner;
public class ContarVocales {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print(“Introduce una cadena: “);
String cad = sc.nextLine();
int contadorVocales = 0;
cad = cad.toLowerCase(); // Convertir a minúsculas para que no distinga entre mayúsculas y minúsculas
for (int i = 0; i < cad.length(); i++) {
char c = cad.charAt(i);
if (c == ‘a’ || c == ‘e’ || c == ‘i’ || c == ‘o’ || c == ‘u’) {
contadorVocales++;
}
}
System.out.println(“El número de vocales es: ” + contadorVocales);
}
}
Actividad 2: Revertir una Cadena
Escribe un programa que invierta una cadena ingresada por el usuario.
- Solicitar al usuario que ingrese una cadena de texto.
- Usar el método
reverse()
deStringBuilder
oStringBuffer
para invertir la cadena. - Mostrar la cadena invertida.
Ejemplo:
String cad = "Hola Mundo";
// Debería imprimir: "odnuM aloH"
import java.util.Scanner;
public class RevertirCadena {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print(“Introduce una cadena: “);
String cad = sc.nextLine();
StringBuilder sb = new StringBuilder(cad);
sb.reverse(); // Invertir la cadena
System.out.println(“Cadena invertida: ” + sb);
}
}
Actividad 3: Comprobación de Palíndromo
Verificar si una cadena es un palíndromo (una palabra que se lee igual de izquierda a derecha que de derecha a izquierda).
- Solicitar al usuario que ingrese una cadena.
- Eliminar espacios y convertir todos los caracteres a minúsculas para hacer la comparación más sencilla.
- Comprobar si la cadena es igual a su versión invertida.
- Imprimir si la cadena es un palíndromo o no.
Ejemplo:
String cad = "Anita lava la tina";
// Debería imprimir: "Es un palíndromo."
import java.util.Scanner;
public class ComprobarPalindromo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print(“Introduce una cadena: “);
String cad = sc.nextLine();
cad = cad.replaceAll(“\\s+”, “”).toLowerCase(); // Eliminar espacios y convertir a minúsculas
boolean esPalindromo = true;
for (int i = 0; i < cad.length() / 2; i++) {
if (cad.charAt(i) != cad.charAt(cad.length() – i – 1)) {
esPalindromo = false;
break;
}
}
if (esPalindromo) {
System.out.println(“Es un palíndromo.”);
} else {
System.out.println(“No es un palíndromo.”);
}
}
}
Actividad 4: Contar las Palabras de una Cadena
Crear un programa que cuente el número de palabras en una cadena de texto.
- Solicitar al usuario que ingrese una cadena de texto.
- Contar cuántas palabras hay en la cadena.
- Imprimir el número de palabras.
Ejemplo:
String cad = "Hoy es un gran día";
// Debería imprimir: "El número de palabras es: 5"
import java.util.Scanner;
public class ContarPalabras {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print(“Introduce una cadena: “);
String cad = sc.nextLine();
int contadorPalabras = 0;
boolean enPalabra = false;
for (int i = 0; i < cad.length(); i++) {
char c = cad.charAt(i);
if (Character.isWhitespace(c)) {
enPalabra = false; // Si encontramos un espacio, terminamos la palabra
} else if (!enPalabra) {
enPalabra = true; // Si no estábamos en una palabra, comenzamos una nueva
contadorPalabras++;
}
}
System.out.println(“El número de palabras es: ” + contadorPalabras);
}
}
Actividad 5: Eliminar Espacios Extra en una Cadena
Eliminar los espacios extra de una cadena (más de uno consecutivo), dejando solo uno entre las palabras.
- Solicitar al usuario que ingrese una cadena con espacios extra.
- Usar el método
trim()
para eliminar los espacios al principio y final. - Imprimir la cadena corregida.
Ejemplo:
String cad = " Hola Mundo Java ";
// Debería imprimir: "Hola Mundo Java"
import java.util.Scanner;
public class EliminarEspaciosExtra {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print(“Introduce una cadena con espacios extra: “);
String cad = sc.nextLine();
// Eliminar espacios iniciales y finales
cad = cad.trim();
// Reemplazar múltiples espacios por uno solo
StringBuilder sb = new StringBuilder();
boolean enEspacio = false;
for (int i = 0; i < cad.length(); i++) {
char c = cad.charAt(i);
if (Character.isWhitespace(c)) {
if (!enEspacio) {
sb.append(‘ ‘); // Añadir solo un espacio
enEspacio = true; // Marcar que estamos en un espacio
}
} else {
sb.append(c);
enEspacio = false; // Salir del espacio
}
}
System.out.println(“Cadena corregida: ” + sb);
}
}