Codemaker Java

Java Tema 4

Caracteres y textos avanzados

Con caracteres y textos se pueden realizar muchas acciones en programación, muy habituales en campos como la Ciberseguridad.

Cadenas de texto (String)#

Para guardar texto (palabras, frases), usamos String. A diferencia de int o double, String no es un tipo primitivo, es una clase.

Esto tiene dos implicaciones fundamentales:

  • Tiene métodos: Acciones ya programadas que podemos usar (saber su longitud, pasar a mayúsculas, etc.).
  • Se guarda en memoria como un objeto: Internamente es como un array de caracteres (char), donde cada letra tiene una posición o índice que empieza siempre en 0.

Métodos (funciones) útiles de String#

Un String no se puede modificar (es inmutable). Si usas un método como los siguientes, no se cambia el String original. Si lo necesitas, puedes guardar lo que el método te devuelve (contesta) en un String nuevo.

Veamos los principales métodos en la siguiente tabla. Supongamos que tenemos la variable String frase = "Hola a todos";. Podemos usar los siguientes métodos:

MétodoDescripciónDevuelve (contesta)Ejemplo
length()Devuelve el número de caracteres.intfrase.length() → 12
charAt(int i)Devuelve el carácter en el índice i.charfrase.charAt(1) → o
equals(String s)Compara si el contenido es idéntico.booleanfrase.equals("Adios") → false
equalsIgnoreCase(String s)Igual que equals pero ignora may/min.booleanfrase.equalsIgnoreCase("HoLa A ToDoS") → true
toUpperCase()Devuelve una nueva cadena en mayúsculas.Stringfrase.toUpperCase() → "HOLA A TODOS"
toLowerCase()Devuelve una nueva cadena en minúsculas.Stringfrase.toLowerCase() → "hola a todos"
substring(int inicio, int fin)Devuelve la subcadena desde inicio hasta fin-1.Stringfrase.substring(1, 3) → "ol"
indexOf(String s)Devuelve el índice de la primera aparición de s.intfrase.indexOf("la") → 2
contains(String s)Devuelve true si el texto contiene a s.booleanfrase.contains("ol") → true
replace(char old, char new)Cambia unas letras por otras.Stringfrase.replace('a', 'o') → "Holo o todos"
startsWith(String s)Comprueba si empieza por ese texto.booleanfrase.startsWith("H") → true
split(String s)Parte el String en trozosString[]frase.split(" ") → {"Hola", "a", "todos"}

Errores comunes#

1. Comparar con ==: en Java, para comparar el contenido de dos textos no se usa ==, si no .equals().

2. El índice fuera de rango: si intentas acceder a una posición que no existe, el programa "explotará" con un error llamado StringIndexOutOfBoundsException.

Secuencias de Escape#

Para incluir caracteres especiales dentro de un String, usamos la barra invertida \:

SecuenciaQué escribeEn el códigoSe ve en la consola
\nSalto de línea"Hola\nAdiós"Hola y, debajo, Adiós
\tTabulador"Nombre\tEdad"Nombre Edad
\"Comillas dobles dentro del texto"Dijo \"hola\""Dijo "hola"
\\Una barra invertida"C:\\Users"C:\Users

Caracteres (char)#

No hay que confundir un char con un String de una letra:

charString
ComillasSimples: 'A'Dobles: "A"
Qué guardaUn único carácterUn texto, de cualquier longitud (incluso vacío: "")
Qué esUn tipo primitivo (en realidad, un número)Una clase, con métodos como length()
Cómo se comparaletra == 'A'texto.equals("A")

Cuando guardamos una variable char, Java no guarda realmente una letra o caracter, guarda en la memoria un número. Para saber qué número le corresponde a cada letra, podemos consultar la tabla ASCII.

NumCharNumCharNumCharNumChar
32(sp)56880P104h
33!57981Q105i
34"58:82R106j
35#59;83S107k
36$60<84T108l
37%61=85U109m
38&62>86V110n
39'63?87W111o
40(64@88X112p
41)65A89Y113q
42*66B90Z114r
43+67C91[115s
44,68D92\116t
45-69E93]117u
46.70F94^118v
47/71G95_119w
48072H96`120x
49173I97a121y
50274J98b122z
51375K99c123{
52476L100d124|
53577M101e125}
54678N102f126~
55779O103g

Sabiendo esto, podemos hacer algunas operaciones interesantes. Por ejemplo, podemos sumar o restar a un caracter:

Java
char letra = 'a';
System.out.println(letra+1); //Imprime 98

O pasar números a caracteres:

Java
System.out.println( (char)100 ); //Imprime 'd'

Errores frecuentes#

Mensaje o síntomaQué significaCómo se arregla
Comparar con == da false aunque los textos sean iguales== compara si son el mismo objeto en memoria, no si tienen las mismas letrasUsa .equals(): if (nombre.equals("Ana"))
StringIndexOutOfBoundsException: Index 10 out of bounds for length 4Al ejecutar: has pedido con charAt una posición que el texto no tieneLas posiciones van de 0 a texto.length() - 1
unclosed character literalHas puesto más de una letra entre comillas simples: 'ab'Un char es una sola letra: 'a'. Para más letras, usa un String con comillas dobles
incompatible types: String cannot be converted to charHas escrito char c = "a"; con comillas doblesLos char van con comillas simples: char c = 'a';
Un método como toUpperCase() «no hace nada»Los String no se modifican: el método devuelve uno nuevoGuarda el resultado: nombre = nombre.toUpperCase();