- Aprender
- Informática
- Programación
- Programación orientada a objetos con Java
- Listas, arreglos y cadenas en Java
Listas, arreglos y cadenas en Java
PrincipianteUnidad 4 de 11 del curso Curso de Programación orientada a objetos con Java
Lo que aprenderás
- Crea ArrayLists, añade, lee, sustituye y elimina elementos, comprueba qué contiene una lista y comprende qué ocurre cuando se comparte una lista o se pasa a un método.
- Crea una lista y trabaja con sus elementos mediante índicesImporta y crea un ArrayList, añade elementos, léelos y sustitúyelos mediante índices, y mantente dentro del rango de índices válidos.
- Elimina elementos y comprueba qué contiene una listaElimina elementos por índice o por valor, busca valores con contains e indexOf y evita los errores habituales con listas de Integer e índices que se desplazan.
- Comparte listas entre variables y métodosExplica qué contiene una variable de lista, qué ocurre cuando se asigna una lista o se pasa a un método, cómo copiar una lista y cómo comparar dos listas.
- Crea una lista y trabaja con sus elementos mediante índices
- Crea arreglos, lee y escribe sus elementos, pásalos y cópialos correctamente, y elige entre un arreglo y un ArrayList.
- Crea arreglos y accede a sus elementosDeclara y crea arreglos, llénalos, lee y escribe elementos mediante índices, y conoce su longitud, sus valores predeterminados y cómo imprimirlos.
- Pasa, copia y compara arreglos, y elige entre arreglos y listasExplica las referencias a arreglos, copia y compara arreglos correctamente, intercambia elementos y decide cuándo conviene usar un arreglo o un ArrayList.
- Crea arreglos y accede a sus elementos
- Visita cada elemento con bucles con índice y bucles for-each, calcula totales, medias y valores extremos, busca valores y modifica una lista de forma segura mientras la recorres.
- Recorre listas y arreglos con for y for-eachEscribe bucles con índice y bucles for-each sobre listas, arreglos y los caracteres de una cadena, y elige el bucle adecuado para cada tarea.
- Calcula totales, medias, recuentos y valores extremosUtiliza variables acumuladoras para calcular sumas, medias, recuentos, máximos y mínimos, y crea una lista filtrada.
- Busca un valor en una lista o un arregloEscribe búsquedas lineales que devuelvan una posición, una respuesta de sí o no o todas las coincidencias, y busca por una condición en lugar de por un valor exacto.
- Modifica una lista de forma segura mientras la recorresElimina o añade elementos durante un bucle sin omitir elementos ni provocar una excepción, y elige una forma segura de hacerlo.
- Recorre listas y arreglos con for y for-each
- Trata una cadena como una secuencia de caracteres, busca y extrae partes, límpiala y convierte líneas de texto en datos y viceversa.
- Lee los caracteres de una cadenaUtiliza length y charAt, recorre caracteres, trabaja con valores char, une texto con + y comprende que las cadenas no pueden cambiar.
- Busca, extrae y limpia partes de una cadenaLocaliza texto con indexOf y contains, extrae partes con substring y modifica mayúsculas, espacios y contenido con replace, trim y métodos relacionados.
- Divide texto en partes y convierte texto en númerosDivide una línea en campos con split, convierte campos en números y números en texto, comprueba las partes y vuelve a unirlas.
- Lee los caracteres de una cadena
- Compara cadenas por contenido y por orden alfabético, y utiliza StringBuilder para construir y modificar texto paso a paso.
- Compara cadenas con equals y compareToUtiliza equals y equalsIgnoreCase para comprobar el contenido, evita el error de == y los errores con null, y utiliza compareTo para ordenar cadenas.
- Construye y modifica texto con StringBuilderUtiliza StringBuilder para construir texto en un bucle y modificarlo in situ, convierte el resultado en una String y evita los errores habituales con StringBuilder.
- Compara cadenas con equals y compareTo
Guía de estudio de Listas, arreglos y cadenas en Java
1Almacena y gestiona datos en un ArrayList
Un ArrayList conserva valores relacionados en una colección ordenada, incluso cuando no conoces la cantidad final. Empieza creando una lista con un tipo y aprende a insertar, sustituir, eliminar y buscar elementos por índice o por valor. Después, sigue lo que ocurre cuando dos variables o un método comparten esa lista, para poder elegir entre modificar los datos existentes y crear un resultado independiente.
1.1 Crea y modifica un ArrayList
Un ArrayList almacena valores en orden. Crece cuando añades un elemento y se reduce cuando eliminas uno. Cada elemento tiene un índice, que comienza en 0. Importa la clase antes de usarla: import java.util.ArrayList;.
Crea una lista con un tipo
ArrayList<String> drinks = new ArrayList<>();
drinks.add("tea");
drinks.add("milk");
El tipo dentro de <String> indica qué almacena la lista. El diamante <> de la derecha permite que Java infiera ese mismo tipo. La lista comienza vacía, con tamaño 0; después de estas dos llamadas contiene [tea, milk] y tiene tamaño 2. Imprimir la lista directamente muestra sus elementos: System.out.println(drinks);.
El tipo de elemento de una lista debe ser un tipo de clase. Para números, utiliza una clase envoltorio: Integer para int, Double para double, Boolean para boolean o Character para char. ArrayList<int> no compilará. Con ArrayList<Integer> numbers = new ArrayList<>();, numbers.add(5) funciona porque Java empaqueta el int en un Integer. Al leerlo en int n = numbers.get(0); se desempaqueta el valor.
Sigue cada cambio de índice
String old = drinks.set(0, "coffee");
drinks.add(1, "water");
String last = drinks.get(2);
set(0, "coffee") sustituye el primer elemento y devuelve el valor anterior, por lo que old es "tea". El tamaño sigue siendo 2. Insertar "water" en el índice 1 desplaza "milk" a la derecha. La lista es ahora [coffee, water, milk]; last es "milk" y el tamaño es 3.
| Tarea | Llamada | Índice válido |
|---|---|---|
| Leer un elemento | get(i) | De 0 a size() - 1 |
| Sustituir un elemento | set(i, value) | De 0 a size() - 1 |
| Insertar un elemento | add(i, value) | De 0 a size() |
| Añadir un elemento al final | add(value) | No necesita índice |
El índice adicional permitido para la inserción es la posición justo después del último elemento actual. En esta lista, add(3, "juice") añade al final, pero get(3) fallaría antes de esa inserción. Un índice no válido causa una IndexOutOfBoundsException. Utiliza get(size() - 1) para el último elemento, después de comprobar que la lista no está vacía.
Comienza con datos o recopila entradas
Con import java.util.List;, new ArrayList<>(List.of("red", "green", "blue")) crea una lista modificable que contiene esos valores. List.of(...) por sí solo crea una lista no modificable: add, set y remove lanzan UnsupportedOperationException. También verás List<String> names = new ArrayList<>();; la variable de tipo general List sigue admitiendo estos métodos de lista.
Para recopilar líneas hasta encontrar una vacía, utiliza un Scanner llamado scanner y una lista vacía llamada lines:
while (true) {
String line = scanner.nextLine();
if (line.isEmpty()) {
break;
}
lines.add(line);
}
La línea que detiene el bucle se comprueba antes de añadirla, por lo que no se almacena. lines.size() cuenta las líneas almacenadas. lines.isEmpty() comprueba si no hay ninguna y lines.clear() las elimina todas cuando necesitas reutilizar la lista.
Puntos clave
- Los índices comienzan en 0; el último elemento está en
size() - 1. setsustituye;addcon índice inserta y desplaza los elementos posteriores.- Utiliza tipos envoltorio como
Integeren un ArrayList. - Copia
List.of(...)en un ArrayList cuando la lista deba modificarse. clear()elimina todos los elementos; una lista vacía tiene tamaño 0.
1.2 Elimina valores y encuentra sus posiciones
Eliminar un elemento cambia tanto el tamaño como los índices de los elementos posteriores. Una búsqueda te indica si existe un valor o dónde está ahora. Ten clara la diferencia entre un valor y su posición, especialmente en una lista de enteros.
Dos significados de remove
| Llamada | Significado | Resultado devuelto |
|---|---|---|
remove(int index) | Elimina el elemento de una posición | El elemento eliminado |
remove(Object value) | Elimina el primer valor igual | true si se eliminó; en caso contrario, false |
Para [coffee, water, milk], remove(0) devuelve "coffee" y deja [water, milk]. El antiguo índice 2 de "milk" ya no es válido; ese valor se ha desplazado al índice 1. Un índice guardado solo es útil mientras las modificaciones no hayan cambiado las posiciones que describe.
Eliminar por valor no significa eliminar todas las coincidencias. Partiendo de [a, b, a], remove("a") deja [b, a]. Una segunda llamada elimina el "a" restante. Eliminar un valor ausente devuelve false y deja la lista sin cambios, por lo que puedes utilizar el resultado directamente:
boolean removed = names.remove("Lena");
if (removed) {
System.out.println("Name removed");
}
El problema de la sobrecarga con enteros
Un argumento int selecciona la forma por índice, incluso cuando la lista almacena enteros:
ArrayList<Integer> numbers = new ArrayList<>(List.of(10, 20, 30));
int removed = numbers.remove(1);
boolean found = numbers.remove(Integer.valueOf(10));
La primera llamada elimina el elemento del índice 1, por lo que removed es 20 y la lista pasa a ser [10, 30]. La segunda llamada proporciona explícitamente un objeto Integer. Elimina el valor 10, hace que found sea true y deja [30]. Llamar a remove(10) sobre la lista original de tres elementos intentaría acceder al índice 10 y lanzaría IndexOutOfBoundsException.
Elige un resultado de búsqueda
Para colors = [red, green, blue, green], contains("green") es true, indexOf("green") es 1 y lastIndexOf("green") es 3. contains da una respuesta de sí o no. Los dos métodos de índice dan la primera o la última posición que coincide. Un valor ausente produce false o -1, respectivamente.
Estos métodos utilizan equals para comparar elementos. El contenido de las cadenas debe coincidir exactamente, incluidas las mayúsculas y minúsculas: indexOf("Green") es -1 para esta lista. Para una búsqueda que no distinga mayúsculas de minúsculas, un bucle puede comparar cada nombre con equalsIgnoreCase.
Una coincidencia en el índice 0 sigue siendo una coincidencia. La prueba indexOf(x) > 0 la pierde. Si necesitas la posición, comprueba explícitamente el indicador de ausencia:
int index = colors.indexOf("red");
if (index != -1) {
colors.remove(index);
}
Aquí la búsqueda devuelve 0, la comprobación se cumple y eliminar el índice 0 deja [green, blue, green]. Para evitar nombres duplicados, comprueba antes de añadir: if (!names.contains(name)) { names.add(name); }. Para eliminar todas las apariciones, puedes repetir la eliminación mientras contains sea true o utilizar un bucle seguro en orden inverso. Un bucle hacia delante que siempre incrementa después de eliminar puede omitir un elemento desplazado.
Puntos clave
remove(index)devuelve un elemento;remove(value)devuelve un booleano.- Para un valor entero, utiliza
remove(Integer.valueOf(x)). - La eliminación desplaza los elementos posteriores una posición a la izquierda.
indexOfylastIndexOfdevuelven -1 para un valor ausente; 0 significa que se encontró.- Las búsquedas de cadenas distinguen mayúsculas de minúsculas y comparan el contenido.
- La eliminación por valor solo elimina la primera coincidencia.
1.3 Comprende las listas compartidas y las copias
Una variable de lista contiene una referencia a un objeto. No contiene todos los elementos dentro de la propia variable. Esto explica por qué modificar una lista mediante un nombre puede afectar a otro y por qué asignar un parámetro tiene un efecto diferente al de modificar sus elementos.
Sigue las referencias
ArrayList<String> original = new ArrayList<>(List.of("tea"));
ArrayList<String> alias = original;
ArrayList<String> copy = new ArrayList<>(original);
alias.add("milk");
copy.add("juice");
original y alias apuntan a una misma lista. Después de añadir mediante alias, ambos muestran [tea, milk]. La copia es una lista independiente, creada antes de esa adición, por lo que contiene [tea, juice]. Dos nombres para un mismo objeto son alias. La asignación copia una referencia; el constructor de copia crea una lista nueva y copia los elementos en ella.
La lista copiada contiene referencias a los mismos objetos de elementos. Con cadenas y valores de clases envoltorio, esos objetos no pueden cambiar, por lo que sustituir una posición en una lista no cambia la posición de la otra. Copiar una lista basta para que ambas puedan añadir, eliminar y sustituir elementos de forma independiente.
Un método recibe una copia de la referencia
Java pasa los argumentos por valor. Para una lista, ese valor es una referencia. Quien llama al método y el parámetro apuntan inicialmente a la misma lista:
static void addBonus(ArrayList<Integer> scores, int bonus) {
for (int i = 0; i < scores.size(); i++) {
scores.set(i, scores.get(i) + bonus);
}
}
Llamar a addBonus(scores, 5) sobre [70, 85] cambia la lista de quien llama a [75, 90]. El método no necesita devolver una lista porque modifica el objeto compartido. Pero asignar scores = new ArrayList<>(); dentro del método solo hace que su parámetro local apunte a otra lista. La variable de quien llama sigue apuntando a la lista anterior.
Un parámetro int recibe una copia del número. Modificar ese parámetro no puede cambiar la variable int de quien llama. En ambos casos el parámetro es local; lo que cambia es si su valor conduce a un objeto modificable compartido.
Devuelve datos nuevos cuando esa sea la tarea
static ArrayList<String> longWords(ArrayList<String> words, int minLength) {
ArrayList<String> result = new ArrayList<>();
for (String word : words) {
if (word.length() >= minLength) {
result.add(word);
}
}
return result;
}
El método lee words y escribe solo en result, por lo que la entrada permanece sin cambios. Un método que modifica un argumento debe comunicar ese comportamiento, como hace addBonus. Un método que devuelve datos nuevos facilita la comprobación de la salida por separado de la entrada.
Compara el contenido y gestiona la ausencia de resultados
a == b comprueba si dos referencias de lista apuntan al mismo objeto. a.equals(b) comprueba que los tamaños sean iguales y que los elementos sean iguales en el mismo orden. Dos listas [1, 2] construidas por separado tienen el mismo contenido pero distinta identidad; [2, 1] no tiene el mismo contenido en el orden de la lista.
Una lista vacía es un objeto real de tamaño 0. Un bucle sobre ella se ejecuta cero veces, pero get(0) falla porque no hay índices de elementos. null significa que no hay ningún objeto de lista; entonces incluso size() lanza NullPointerException. Un método sin coincidencias puede devolver una lista de resultados vacía, lo que permite a quien lo llama recorrer el resultado normalmente.
Puntos clave
- La asignación comparte una lista;
new ArrayList<>(original)crea una lista independiente. - Un método puede modificar la lista de quien lo llama mediante una copia de la referencia.
- Reasignar un parámetro no hace que la variable de quien llama apunte a otro objeto.
equalsde una lista compara el contenido ordenado;==compara la identidad.- Una lista vacía permite la iteración;
nullno hace referencia a ninguna lista.
2Almacena datos de tamaño fijo en arreglos
Los arreglos dan a cada valor una posición numerada en una estructura cuya longitud permanece fija. Crea y llena esas posiciones, lee sus valores predeterminados e imprime su contenido de forma clara. Copiar, comparar, intercambiar y pasar arreglos a métodos depende de comprender qué variables hacen referencia al mismo objeto. Utiliza estas ideas para elegir un arreglo o un ArrayList para una tarea concreta.
2.1 Crea arreglos con posiciones fijas
Un arreglo almacena un número fijo de elementos de un mismo tipo. Eliges su longitud al crearlo. Los elementos pueden cambiar, pero el número de posiciones de ese arreglo no. Los arreglos pueden almacenar valores primitivos directamente.
Crea y llena posiciones
int[] scores = new int[5];
scores[0] = 90;
int first = scores[0];
int[] primes = {2, 3, 5, 7, 11};
new int[5] crea cinco posiciones. Sus índices son 0, 1, 2, 3 y 4. Los corchetes permiten leer y escribir una posición, por lo que first pasa a ser 90. El inicializador de primes crea y llena cinco posiciones. Cuando se necesita un arreglo con valores como expresión, por ejemplo como argumento de un método, utiliza new int[] {2, 3, 5}.
La longitud es un campo: scores.length, sin paréntesis. Cuenta todas las posiciones, incluidas las que no has asignado tú mismo. Añadir un valor a la posición 0 no cambia la longitud de 5 a 1.
| Estructura | Número de elementos | Leer un elemento |
|---|---|---|
| Arreglo | a.length | a[i] |
| ArrayList | a.size() | a.get(i) |
| String | s.length() | s.charAt(i) |
Estos nombres no son intercambiables. Un arreglo no tiene método size() y una cadena necesita paréntesis después de length.
Conoce los valores iniciales
Las posiciones de un arreglo nuevo reciben valores predeterminados. Los arreglos de números primitivos comienzan con cero: 0 para int, 0,0 para double. Un boolean[] comienza con false; un char[] comienza con el carácter cuyo código es cero, escrito '\u0000'. Los arreglos de tipos de clase, incluido String[], comienzan con referencias null.
String[] words = new String[3];
words[0] = "sun";
System.out.println(words[0].length());
Esto imprime 3 porque la posición 0 ahora hace referencia a "sun". Las posiciones 1 y 2 siguen conteniendo null. Llamar a words[1].length() lanza NullPointerException: todavía no hay ninguna cadena ahí. Una posición con el valor predeterminado null es diferente de una cadena vacía "", que es un objeto de longitud 0.
Interpreta la salida y mantente dentro del arreglo
Importa java.util.Arrays y utiliza System.out.println(Arrays.toString(scores)); para imprimir [90, 0, 0, 0, 0]. Imprimir scores directamente muestra un código de tipo e identidad como [I@1b6d3586, no sus elementos. El código de identidad no es una representación útil de los números almacenados.
Para una semana de temperaturas en grados Celsius:
double[] temps = {12.5, 14.0, 9.5, 11.0, 15.5, 13.0, 10.5};
temps[2] = 10.0;
La lectura del tercer día cambia de 9,5 a 10,0. La primera lectura es temps[0]; la última es temps[6] o temps[temps.length - 1]. temps[7] está fuera del arreglo. Java lanza ArrayIndexOutOfBoundsException para un índice de arreglo no válido. En un bucle con índice, utiliza i < temps.length: i <= temps.length intenta acceder a una posición adicional después de la última válida. Un arreglo de longitud cero no tiene ningún índice de elemento válido.
Puntos clave
- La longitud de un arreglo se fija cuando se crea.
- Utiliza
a[i]para leer o escribir una posición ya.lengthpara contar posiciones. - Las posiciones numéricas nuevas contienen cero; las posiciones String nuevas contienen
null. Arrays.toString(a)imprime el contenido.- El último índice válido es
a.length - 1.
2.2 Copia, compara e intercambia elementos de arreglos
Una variable de arreglo contiene una referencia, igual que una variable de lista. Asignar esa referencia crea otro nombre para el mismo arreglo. Una copia independiente necesita un objeto de arreglo nuevo y comparar el contenido necesita un método que compruebe las posiciones.
Asignación y copia
int[] a = {4, 9, 2};
int[] alias = a;
int[] copy = Arrays.copyOf(a, a.length);
alias[0] = 99;
Ahora a y alias muestran [99, 9, 2]; copy sigue mostrando [4, 9, 2]. Arrays.copyOf(a, a.length) crea un arreglo nuevo de la misma longitud. a.clone() también puede copiarlo. Importa java.util.Arrays para utilizar los métodos de utilidad.
Una longitud solicitada diferente cambia el arreglo nuevo, no el anterior. Arrays.copyOf(new int[] {2, 3, 5}, 4) produce [2, 3, 5, 0]. Las posiciones adicionales reciben valores predeterminados. Para que una variable haga referencia a un arreglo más grande, asigna a esa variable la copia devuelta. Cualquier alias del original sigue haciendo referencia al arreglo anterior.
Las llamadas a métodos comparten el objeto
static void doubleAll(int[] values) {
for (int i = 0; i < values.length; i++) {
values[i] = values[i] * 2;
}
}
El parámetro recibe una copia de la referencia. Por tanto, el método modifica las posiciones del arreglo de quien lo llama. Reasignar values a un arreglo nuevo solo cambiaría el parámetro. En su lugar, un método puede devolver un arreglo nuevo: return new int[] {values[0], values[values.length - 1]}; produce [4, 2] para la entrada {4, 9, 2}. Esa expresión necesita una entrada no vacía porque lee dos índices.
La igualdad de contenido es diferente para los arreglos
Para los arreglos a = {1, 2} y b = {1, 2} creados por separado, tanto a == b como a.equals(b) son false: equals de un arreglo comprueba la identidad. Arrays.equals(a, b) es true porque los elementos correspondientes coinciden. Esto difiere de ArrayList, cuyo equals compara el contenido ordenado.
Guarda un valor antes de sobrescribirlo
Para intercambiar dos posiciones, conserva un valor anterior en una variable temporal:
int temp = a[0];
a[0] = a[2];
a[2] = temp;
Partiendo de {4, 9, 2}, la primera línea guarda 4. La segunda produce [2, 9, 2]. La tercera restablece el 4 guardado en el índice 2 y completa [2, 9, 4]. Sin temp, asignar a[2] = a[0] después de la segunda línea copiaría de nuevo el 2 y perdería el 4 original.
Elige una estructura adecuada para los datos
| Necesidad | Opción adecuada |
|---|---|
| Una posición fija para cada día o mes | Arreglo |
| Valores primitivos sin envoltorios | Arreglo |
| Añadir o eliminar elementos a medida que llegan datos | ArrayList |
Los arreglos también aparecen en main(String[] args) y como resultado de String.split. Para un String[] words, new ArrayList<>(Arrays.asList(words)) crea una lista que puede crecer. Para un int[], crea un ArrayList<Integer> y añade cada entero en un bucle. Arrays.asList aplicado al arreglo primitivo trata el arreglo completo como un solo elemento, por lo que no crea una lista de sus números individuales.
Puntos clave
- La asignación de un arreglo comparte el mismo objeto;
copyOfoclonecrea una copia. - Utiliza
Arrays.equalspara comparar el contenido de arreglos. - Un método puede modificar posiciones de un arreglo compartido mediante su parámetro.
- Una variable temporal conserva un valor durante un intercambio.
- Utiliza arreglos para posiciones fijas y ArrayLists para cantidades que cambian.
- Convierte un arreglo de primitivos en una lista de envoltorios mediante un bucle.
3Procesa listas y arreglos con bucles
Los bucles convierten valores almacenados en resultados útiles: un total, un recuento, un valor extremo, una colección filtrada o un resultado de búsqueda. Elige cómo visitar los elementos según necesites valores o posiciones. Sigue el estado cambiante de cada bucle para gestionar datos vacíos, conservar las medias con decimales, detener una búsqueda en el momento adecuado y eliminar valores sin pasar por alto los elementos que se desplazan.
3.1 Elige un bucle con índice o un bucle for-each
Un bucle permite que una parte del código procese cada elemento. La elección depende de lo que necesite el cuerpo: solo un valor, su posición o una forma de escribir de nuevo en la colección. Tanto los arreglos como los ArrayLists admiten bucles con índice y bucles for-each.
Visita los valores en orden
for (String task : tasks) {
System.out.println(task);
}
Léelo como «para cada tarea en tasks». Con [shop, cook, clean], imprime las tres cadenas en ese orden. La variable de bucle tiene el tipo de elemento. Para ArrayList<Integer>, utiliza int para desempaquetar cada valor o Integer para conservar la referencia al envoltorio. Para los caracteres de una cadena, for (char c : word.toCharArray()) visita los valores char.
Un bucle for-each no proporciona un índice. Si necesitas líneas numeradas, utiliza un bucle con índice:
for (int i = 0; i < tasks.size(); i++) {
System.out.println((i + 1) + ". " + tasks.get(i));
}
El índice comienza en 0, pero el número de línea mostrado comienza en 1. Los paréntesis hacen que i + 1 sea una suma antes de convertirse en parte del texto. Para un arreglo, cambia la condición a i < tasks.length y lee tasks[i]. Un bucle while puede hacer lo mismo inicializando un contador antes del bucle e incrementándolo en el cuerpo.
Escribe mediante una posición
int[] nums = {4, 9, 2};
for (int n : nums) {
n = n * 2;
}
Esto deja el arreglo sin cambios. Cada pasada coloca una copia de un valor primitivo en n; asignar un valor a esa variable local no escribe en la posición original. Para modificar el arreglo:
for (int i = 0; i < nums.length; i++) {
nums[i] = nums[i] * 2;
}
El resultado es [8, 18, 4]. Para una lista de enteros, la actualización correspondiente es list.set(i, list.get(i) * 2). El índice indica a Java qué elemento almacenado debe sustituir.
Ajusta los límites al cuerpo
Para recorrer una lista en orden inverso, comienza en tasks.size() - 1, continúa mientras i >= 0 y utiliza i--. Esto visita clean, cook y después shop. Para tomar un elemento de cada dos se puede utilizar i += 2 en un bucle hacia delante.
Las comparaciones con el elemento siguiente necesitan un rango más corto. Si el cuerpo lee tanto list.get(i) como list.get(i + 1), la condición es i < list.size() - 1. La última posición inicial válida es el penúltimo elemento. Usar la condición habitual para recorrer todo intentaría leer un elemento siguiente inexistente después del último elemento.
Al procesar juntas dos listas de la misma longitud, utiliza un índice para acceder a ambas. Por ejemplo, names.get(i) y scores.get(i) describen las entradas correspondientes. Un bucle for-each es más sencillo cuando la posición no importa, como al imprimir cada nombre o añadir cada valor a un total.
Comenzar en 1 omite el primer elemento sin aviso. Usar <= size() o <= length intenta acceder a un índice adicional no válido. Una lista o un arreglo vacío no necesita una regla especial de recorrido: la condición inicial es falsa, por lo que el cuerpo se ejecuta cero veces. Cualquier código posterior que divida por el recuento o lea un elemento debe gestionar por sí mismo ese caso vacío.
Puntos clave
- For-each es útil cuando el cuerpo solo necesita cada valor.
- Utiliza un índice para escribir valores almacenados, seguir posiciones o comparar elementos vecinos.
- Asignar un valor a una variable for-each no sustituye un elemento del arreglo o la lista.
- Acceder al elemento siguiente con
i + 1requierei < size() - 1. - Las colecciones vacías hacen que un recorrido normal se ejecute cero veces.
3.2 Calcula un resultado a partir de muchos elementos
Un acumulador conserva un resultado construido a lo largo de las pasadas de un bucle. Inicialízalo antes del bucle, actualízalo dentro y utilízalo después. El valor inicial depende de la tarea: una suma o un recuento comienza en 0, mientras que un máximo necesita un elemento real.
Totales y medias
int sum = 0;
for (int value : numbers) {
sum += value;
}
if (!numbers.isEmpty()) {
double average = (double) sum / numbers.size();
System.out.println(average);
}
Para [4, 7, 8], sum cambia de 0 a 4, después a 11 y luego a 19. Ambos operandos de sum / numbers.size() serían enteros, lo que daría 6. Convertir sum antes de la división da aproximadamente 6,33. Convertir el cociente ya calculado solo transformaría el 6 truncado en 6,0.
Una colección vacía no tiene una media ordinaria. La división entera por cero lanza ArithmeticException; la división en coma flotante 0.0 / 0 da NaN. Decide qué significa el caso vacío para el programa antes de dividir, por ejemplo mostrar «No hay mediciones». Para las distancias decimales [5.0, 7.5, 10.0] km, un total double es 22,5 km y la media es 7,5 km.
Cuenta solo las coincidencias
Un recuento condicional comienza en 0 y se incrementa solo cuando se cumple su condición. Para las temperaturas {22, 27, 31, 24, 26} en grados Celsius, if (t > 25) { count++; } produce 3. Coloca la inicialización fuera del bucle; restablecer count en cada pasada descartaría las coincidencias anteriores.
Encuentra un valor extremo y su posición
Para un arreglo no vacío, comienza con int max = values[0];. Sustituye max cada vez que un valor visitado sea mayor. Comenzar en 0 falla con {-5, -2, -9}: indica 0 aunque ningún elemento tenga ese valor. Comenzar con -5 permite que el bucle llegue al máximo correcto, -2. Un mínimo utiliza el mismo patrón con <.
Cuando la posición importe, conserva el mejor índice:
int best = 0;
for (int i = 1; i < numbers.size(); i++) {
if (numbers.get(i) > numbers.get(best)) {
best = i;
}
}
Para [4, 7, 8], best termina en 2 y numbers.get(best) es 8. El bucle comienza en 1 porque el índice 0 ya es el candidato inicial. Con >, un valor igual no sustituye al candidato actual, lo que conserva el primer máximo. Con >=, cada empate lo sustituye y conserva el último máximo. Comprueba si la colección está vacía antes de crear un candidato en el índice 0.
Recopila los valores que coinciden
El filtrado utiliza una lista de resultados vacía como acumulador. Visita cada palabra, añádela cuando word.length() > 4 y devuelve el resultado. Para [sun, planet, moon, galaxy], el resultado es [planet, galaxy]. Leer la entrada y añadir a una lista independiente deja la entrada sin cambios.
Para dos elementos Integer, == compara la identidad de los objetos. Los valores pequeños almacenados en caché pueden ocultar este error; valores mayores iguales pueden ser objetos distintos. Compara con equals o desempaqueta primero en variables int. Los operadores numéricos <, >, <= y >= desempaquetan los valores envoltorio, por lo que el código del mejor índice compara sus números.
Puntos clave
- Inicializa un acumulador antes del bucle y actualízalo dentro.
- Realiza una conversión explícita antes de la división entera para conservar la parte fraccionaria de una media.
- Comprueba si la colección está vacía antes de calcular una media o seleccionar un valor extremo.
- Inicializa un máximo o mínimo a partir de un elemento real.
>conserva el primer máximo;>=conserva el último.- El filtrado acumula las coincidencias en una lista nueva.
- Utiliza la igualdad por valor para dos objetos Integer.
3.3 Busca hasta encontrar una coincidencia o llegar al final
Una búsqueda lineal comprueba los elementos en secuencia. Funciona con datos en cualquier orden. Una búsqueda de la primera coincidencia que tiene éxito puede detenerse antes; una búsqueda sin éxito debe llegar al final antes de saber que ningún elemento coincide.
Devuelve el primer índice que coincide
static int indexOfName(ArrayList<String> names, String target) {
for (int i = 0; i < names.size(); i++) {
if (names.get(i).equals(target)) {
return i;
}
}
return -1;
}
Si el primer nombre que coincide está en el índice 2, el método comprueba los índices 0, 1 y 2, y después devuelve 2 inmediatamente. El return -1 está después del bucle porque solo un recorrido completo establece que no se ha encontrado. Poner else { return -1; } dentro haría que se detuviera en el primer elemento que no coincide e ignorara todos los candidatos posteriores.
El indicador de ausencia -1 no puede ser un índice válido. Quien llama al método debe comprobarlo antes de leer el resultado:
int index = indexOfName(names, "Ahmed");
if (index != -1) {
System.out.println(names.get(index));
}
La prueba index > 0 pasaría por alto una coincidencia válida en el índice 0. Usar -1 directamente en get lanzaría una excepción. En una lista vacía el cuerpo del bucle nunca se ejecuta y el método devuelve correctamente -1.
Cambia la comparación según la tarea
Para valores exactos de una lista, contains e indexOf ya realizan una búsqueda lineal. Escribe un bucle para un arreglo o una condición como «empieza por L». Utiliza equals o equalsIgnoreCase para cadenas, == para primitivos y equals para dos objetos Integer. Una comprobación de identidad de cadenas puede pasar por alto texto igual.
Para String[] cities = {"Oslo", "Lima", "Lagos", "Pune"}, comprueba cities[i].startsWith("L"). El índice 0 no cumple la condición; el índice 1 sí, por lo que el resultado de la primera coincidencia es 1. Si la tarea pide todas las coincidencias, no retornes ahí. Añade los índices que coincidan a una lista de resultados y termina el recorrido; eso da [1, 2]. Para contar coincidencias, incrementa un contador en lugar de almacenar posiciones.
Elige la forma de la respuesta
Una búsqueda de sí o no puede comenzar con boolean found = false;. Ante una coincidencia, asígnale true y sal del bucle con break. Sin break, la respuesta final sigue siendo true, pero el programa comprueba valores que ya no necesita. Un método de búsqueda también puede devolver true inmediatamente y devolver false después del bucle.
Devolver un elemento requiere un resultado distinto para «no se encontró nada». Para una String, a menudo es null; quien llama debe comprobarlo antes de llamar a un método de String. Devolver un índice con -1 hace visible el caso de ausencia sin afirmar que una cadena vacía es un dato ausente.
Cuenta el trabajo que realmente hace la búsqueda
Un valor buscado en la primera posición requiere una comparación. Un valor en la tercera posición requiere tres. Un valor ausente entre 10 000 nombres requiere las 10 000 comparaciones. La primera comparación fallida no puede establecer que el valor buscado no esté en las posiciones restantes. Una búsqueda de todas las coincidencias también comprueba cada elemento, incluso después de una coincidencia temprana, porque los valores posteriores también pueden coincidir.
Puntos clave
- La búsqueda lineal visita los elementos en secuencia y funciona con cualquier orden de entrada.
- Devuelve un índice en la primera coincidencia; devuelve -1 solo después del bucle.
- Utiliza la comparación adecuada para el tipo de elemento.
- Las búsquedas de todas las coincidencias continúan después de encontrar una.
- Comprueba el indicador de ausencia antes de utilizar el resultado de la búsqueda.
3.4 Elimina elementos sin omitirlos
Eliminar elementos de un ArrayList cambia las posiciones que un bucle intenta visitar. El patrón seguro depende de si necesitas modificar la lista original o construir un resultado independiente. Sustituir valores es más sencillo porque mantiene las posiciones en su sitio.
Observa cómo un bucle hacia delante omite un valor
Supón que un bucle elimina los números pares de [3, 8, 8, 5] y siempre incrementa i. En el índice 1 elimina el primer 8. El segundo 8 se desplaza al índice 1, pero la siguiente pasada utiliza el índice 2. El resultado es [3, 8, 5], con un número par restante. La condición era correcta; el desplazamiento tras la eliminación causó el problema.
Un bucle for-each sobre un ArrayList tampoco debe añadir ni eliminar elementos a través de la lista. Utiliza un iterador cuyo estado de recorrido deja de coincidir con la lista modificada. Java normalmente informa de una ConcurrentModificationException. Algunas modificaciones pueden terminar el bucle sin aviso y dejar un elemento sin visitar. La ausencia de una excepción no hace que esa modificación sea segura.
Elimina en orden inverso para mantener estables las posiciones no comprobadas
for (int i = numbers.size() - 1; i >= 0; i--) {
if (numbers.get(i) % 2 == 0) {
numbers.remove(i);
}
}
Para [3, 8, 8, 5], el índice 3 contiene 5 y se conserva. El índice 2 contiene 8 y se elimina. El índice 1 sigue conteniendo el otro 8 y se elimina a continuación. El índice 0 contiene 3 y se conserva. El resultado es [3, 5]. Una eliminación desplaza los elementos a la derecha del índice actual, que este bucle en orden inverso ya ha comprobado.
Construye la lista de valores que se conservarán
Cuando la lista original deba permanecer sin cambios, crea una lista nueva:
ArrayList<Integer> odds = new ArrayList<>();
for (int value : numbers) {
if (value % 2 != 0) {
odds.add(value);
}
}
Este bucle for-each es seguro porque lee numbers y añade a una lista diferente. Con [3, 8, 8, 5] como entrada, odds contiene [3, 5] y la entrada sigue conteniendo los cuatro valores. Un arreglo tampoco puede reducirse; filtrar sus valores también requiere un arreglo o una lista nuevos.
Deja que un iterador gestione su propia eliminación
Iterator<Integer> it = numbers.iterator();
while (it.hasNext()) {
if (it.next() % 2 == 0) {
it.remove();
}
}
Importa java.util.Iterator. next() proporciona el siguiente elemento e it.remove() elimina el elemento recién devuelto mientras mantiene coherente la posición del iterador. No sustituyas esa llamada por numbers.remove(...) en este bucle.
Un bucle while hacia delante también puede funcionar si incrementa solo cuando no se ha eliminado nada. Después de una eliminación debe volver a inspeccionar el mismo índice, al que ha llegado el siguiente elemento. Esto requiere más cuidado que un bucle en orden inverso o una lista de resultados nueva.
Las sustituciones y las adiciones tienen efectos diferentes
set(i, value) es seguro en un bucle con índice porque no cambia el tamaño ni las posiciones. Añadir en cada pasada mientras se comprueba i < list.size() puede alejar continuamente el final y hacer que el bucle no termine. Guarda int originalSize = list.size(); y recorre solo hasta ese límite cuando cada elemento original deba causar la adición de un valor al final.
Puntos clave
- Eliminar hacia delante y después ejecutar
i++omite el elemento desplazado a la posición eliminada. - Un bucle en orden inverso puede eliminar por índice de forma segura.
- Filtrar en otra lista conserva la original.
- Utiliza el propio
removede un iterador durante su recorrido. - Un recorrido for-each no debe añadir ni eliminar elementos a través de su lista de origen.
- Limita los bucles que añaden al final al tamaño original cuando solo proceses los elementos originales.
4Trabaja con texto mediante métodos de String
El texto llega como caracteres, pero un programa a menudo necesita nombres, números o partes concretas de una línea. Lee posiciones con métodos de String, encuentra un separador antes de extraer texto y convierte los campos separados en valores con los que puedas calcular. Sigue los resultados devueltos: las cadenas son inmutables y limpiar una cadena solo ayuda al código posterior cuando este utiliza el texto limpio.
4.1 Lee caracteres y conserva los resultados de String
Una String almacena texto como una secuencia de valores char. Los índices comienzan en 0, igual que en arreglos y listas. Un objeto String no puede cambiar después de crearse, por lo que los métodos que producen texto modificado devuelven un resultado que debes conservar.
Un carácter es diferente de una cadena
"Hello".length() es 5. "Hello".charAt(0) es 'H' y charAt(4) es 'o'. Un char utiliza comillas simples y contiene una unidad de código UTF-16; una String utiliza comillas dobles y puede contener cero, una o muchas de esas unidades. "Java".charAt(0) == 'J' compara dos caracteres primitivos. Comparar ese char con "J" no compila porque los tipos son diferentes.
charAt(length()) queda fuera del final y lanza StringIndexOutOfBoundsException. Incluso charAt(0) falla para "". Comprueba isEmpty() antes de leer el primer carácter de la entrada.
length() cuenta valores char de UTF-16, que no siempre son símbolos completos visibles. "café".length() es 4; "Hi 👋".length() es 5 porque el emoji de la mano que saluda ocupa dos posiciones char. Utiliza ese recuento al razonar sobre los índices de estos métodos.
Visita y comprueba los caracteres
String text = "Programming in Java".toLowerCase();
int vowels = 0;
for (int i = 0; i < text.length(); i++) {
char c = text.charAt(i);
if ("aeiou".indexOf(c) >= 0) {
vowels++;
}
}
La conversión a minúsculas permite que la misma comprobación de pertenencia reconozca vocales mayúsculas y minúsculas. Cada indexOf(c) es no negativo cuando el carácter aparece en "aeiou". El recuento llega a 6: o, a, i, i, a, a. for (char c : text.toCharArray()) puede visitar los mismos valores sin un índice.
La clase Character proporciona comprobaciones como isLetter, isDigit, isWhitespace e isUpperCase. Character.isDigit('7') es true, mientras que Character.isLetter('7') es false. Character.toUpperCase(c) y toLowerCase(c) devuelven valores char convertidos.
Los caracteres también tienen códigos numéricos. 'a' + 1 produce el int 98; (char) ('a' + 1) convierte ese código en 'b'. Para un carácter de dígito ASCII, restar '0' da su valor: '7' - '0' es 7. Restar el código de cero funciona porque esos códigos de dígitos son consecutivos.
Lee la concatenación de izquierda a derecha
| Expresión | Resultado |
|---|---|
"Total: " + 3 + 4 | "Total: 34" |
3 + 4 + " items" | "7 items" |
"Total: " + (3 + 4) | "Total: 7" |
Una vez que el lado izquierdo de + es texto, el siguiente número se une como texto. Los paréntesis obligan a realizar la suma numérica antes de unir. Unas pocas uniones en una expresión son un uso claro de +.
Guarda el texto devuelto
String name = "Lena";
name.toUpperCase();
System.out.println(name);
name = name.toUpperCase();
La impresión sigue mostrando "Lena": la llamada cuyo resultado se descartó no modificó su objeto. La asignación hace después que name haga referencia a "LENA". La inmutabilidad de String significa que el texto anterior permanece sin cambios aunque otras variables hagan referencia a él. Conservar el resultado y modificar el objeto original son operaciones diferentes.
Puntos clave
charAt(i)devuelve un char; los índices válidos terminan enlength() - 1.- Los char utilizan comillas simples; las cadenas utilizan comillas dobles.
- La longitud de String cuenta valores char de UTF-16, por lo que algunos símbolos ocupan dos posiciones.
- Los métodos de
Charactercomprueban y convierten valores char individuales. - La unión de cadenas con
+procede de izquierda a derecha. - Almacena el resultado de una transformación de String.
4.2 Busca y extrae partes de texto
El procesamiento de texto suele seguir una secuencia breve: encontrar un marcador, comprobar que existe y extraer la parte que necesitas. Las operaciones de limpieza pueden preparar el texto antes de una búsqueda o comparación. Cada operación de String devuelve un resultado sin modificar su objeto original.
Encuentra posiciones o plantea una pregunta de sí o no
Para "banana", indexOf('a') devuelve 1, indexOf("a", 2) devuelve 3 y lastIndexOf('a') devuelve 5. El segundo argumento elige dónde comienza la búsqueda hacia delante. Una búsqueda sin coincidencias da -1, como en indexOf("x").
Utiliza contains(text) cuando solo necesites saber si aparece un texto. startsWith(prefix) comprueba el principio y endsWith(suffix) el final. "report.pdf".endsWith(".pdf") es true. Estas búsquedas distinguen mayúsculas de minúsculas: "Hello".contains("hello") es false. Los métodos de índice aceptan un char o una String; contains recibe texto.
Substring termina justo antes de su índice final
String word = "programming";
String middle = word.substring(3, 7);
String tail = word.substring(3);
middle es "gram" y utiliza las posiciones 3, 4, 5 y 6. Su longitud es 7 - 3, es decir, 4. tail es "gramming", porque omitir el argumento final hace que llegue hasta el final de la cadena. El comienzo debe ser no negativo y no mayor que el final; el final no puede superar length(). Los límites no válidos lanzan StringIndexOutOfBoundsException.
Para una dirección de correo electrónico, encuentra el separador antes de extraer:
String email = "lena.ito@example.com";
int at = email.indexOf("@");
if (at != -1) {
String user = email.substring(0, at);
String domain = email.substring(at + 1);
}
El separador está en el índice 8. La primera parte termina antes de él y da "lena.ito"; la segunda comienza después y da "example.com". Si el marcador no aparece, at es -1. Llamar a substring(0, at) sin la comprobación fallaría. Comenzar la segunda parte en at conservaría la @ en el dominio.
Limpia solo lo que afecta a la operación
| Método | Efecto |
|---|---|
toUpperCase() / toLowerCase() | Devuelven texto con las letras convertidas a mayúsculas o minúsculas |
trim() | Elimina caracteres iniciales y finales con códigos hasta U+0020 |
strip() | Elimina caracteres de espacio en blanco iniciales y finales reconocidos por Character.isWhitespace |
replace(target, replacement) | Sustituye cada aparición literal |
repeat(n) | Une n copias del texto |
" hello ".trim() da "hello"; los espacios interiores permanecen. strip() gestiona caracteres adicionales de espacio en blanco de Unicode, como el espacio em. Utiliza la definición de espacio en blanco de Java, que no incluye todos los caracteres que parecen un espacio. "banana".replace('a', 'o') da "bonono". "ab".repeat(3) da "ababab".
Una cadena vacía y una cadena en blanco son diferentes
isEmpty() comprueba que la longitud sea 0. isBlank() también acepta texto formado solo por caracteres de espacio en blanco de Java. Para " ", el primero es false y el segundo true. Utiliza la comprobación que corresponda a la regla de entrada. Para limpiar una respuesta como " Yes ", answer.trim().toLowerCase() devuelve "yes". Almacena ese texto devuelto si la variable debe conservar el valor limpio; una llamada aislada answer.trim(); lo descarta.
Puntos clave
- Las búsquedas de posición devuelven -1 cuando falta un marcador.
substring(begin, end)incluye begin y excluye end.- Comprueba una posición encontrada antes de usarla como límite de extracción.
replacesustituye texto literal;trimystripactúan en los extremos.isBlankacepta texto formado solo por espacios en blanco, mientras queisEmptyrequiere longitud 0.
4.3 Convierte una línea de texto en campos utilizables
Una línea de datos puede contener varios valores separados por una coma u otro marcador. La división produce un arreglo de cadenas; después, el análisis sintáctico convierte los campos seleccionados en números. Comprueba la estructura de los datos antes de usar sus posiciones.
Divide en un arreglo
String[] fields = "Ada,36,London".split(",");
Hay tres campos: "Ada", "36" y "London". Las comas no se conservan. fields.length es 3 y fields[1] sigue siendo texto, no un número.
El separador que se pasa a split es una expresión regular, un patrón que no siempre es texto literal. Una coma se representa a sí misma, pero ., |, *, + y ? tienen significados especiales. Para dividir una cadena de versión por puntos literales, utiliza "1.5.2".split("\\."). Dos barras invertidas en la cadena Java producen la única barra invertida del patrón que hace que el punto sea literal. En cambio, split(".") coincide con caracteres individuales y produce un arreglo vacío en este ejemplo.
Gestiona espacios y partes vacías
Dividir "a b" por " " produce tres partes: "a", "" y "b". Cada separador es un espacio, por lo que los espacios contiguos dejan una parte vacía entre ellos. Para secuencias de espacios en blanco, utiliza:
String[] words = " red green blue ".trim().split("\\s+");
El resultado es [red, green, blue]. Eliminar primero los espacios de los extremos evita una parte inicial vacía causada por un separador al principio. Por defecto, split descarta las partes vacías finales: "a,b,,".split(",") produce solo "a" y "b". Cuenta los campos resultantes reales antes de acceder a ellos mediante índices.
Convierte cada campo a su tipo previsto
Integer.parseInt("42") devuelve el int primitivo 42. Integer.valueOf("-7") devuelve un objeto Integer. Double.parseDouble("5.2") devuelve 5,2 y utiliza un punto como separador decimal independientemente de la configuración regional del equipo. El análisis de enteros acepta texto de enteros sin separador decimal. Integer.parseInt("4.5") falla en lugar de redondear.
Elimina los espacios de los extremos de los campos antes de convertirlos, especialmente en el texto de enteros: Integer.parseInt(" 42") lanza NumberFormatException. Dividir por comas no elimina los espacios alrededor de los campos. Un número correcto de campos tampoco garantiza que un campo contenga un número válido.
Lee un registro completo
String line = "Amira,10.5,63";
String[] parts = line.split(",");
if (parts.length == 3) {
String name = parts[0].trim();
double distanceKm = Double.parseDouble(parts[1].trim());
int minutes = Integer.parseInt(parts[2].trim());
double pace = minutes / distanceKm;
System.out.println(name + ": " + pace + " min/km");
}
La distancia es 10,5 km, el tiempo es 63 minutos y el ritmo es 6,0 min/km. La línea incompleta "Amira,10.5" tiene solo dos campos; sin la comprobación del número de campos, parts[2] lanzaría ArrayIndexOutOfBoundsException. Un programa puede omitir o comunicar ese registro incompleto antes de utilizar cualquier posición ausente.
Convierte o une de nuevo el texto
String.valueOf(42) e Integer.toString(42) dan "42". String.join(", ", List.of("Oslo", "Lima", "Pune")) da "Oslo, Lima, Pune" e inserta separadores solo entre las partes. Acepta una lista, un arreglo o argumentos de cadena separados. La unión no analiza ni calcula: combina las cadenas proporcionadas.
Puntos clave
splitdevuelve un arreglo de String y trata su separador como un patrón.- Escapa un punto literal como
"\."en código Java. - Elimina los espacios de los extremos antes de dividir por secuencias de espacios en blanco y de convertir campos enteros.
- Por defecto, split descarta los campos vacíos finales.
- Comprueba el número de campos y el texto numérico antes de utilizar los datos convertidos.
- Utiliza
String.joinpara partes de texto y métodos de análisis para números.
5Compara cadenas correctamente y construye texto de forma eficiente
El texto que parece igual puede pertenecer a diferentes objetos String. Elige una comparación adecuada para la tarea: igualdad de contenido, igualdad sin distinguir mayúsculas de minúsculas u ordenación de caracteres de Java. Después, construye y modifica partes de texto más grandes con StringBuilder. Seguir tanto las referencias como los valores devueltos te ayuda a predecir si una operación modifica texto existente, crea un resultado o simplemente compara dos objetos.
5.1 Compara el contenido y el orden de las cadenas
Dos variables pueden contener texto con los mismos caracteres sin hacer referencia al mismo objeto String. Elige una comparación según la pregunta: contenido igual, contenido igual sin distinguir mayúsculas de minúsculas o qué texto va primero en el orden de Java.
Utiliza equals para el contenido
String answer = new String("yes");
System.out.println(answer == "yes");
System.out.println(answer.equals("yes"));
El primer resultado es false: el objeto creado por separado no es el objeto del literal. El segundo es true porque los caracteres coinciden. Los literales idénticos como "yes" == "yes" comparten un objeto y pueden hacer que la comparación de identidad parezca fiable. El texto obtenido durante la ejecución puede utilizar objetos nuevos o existentes, por lo que la identidad no es la prueba adecuada para comprobar si una entrada coincide.
equalsIgnoreCase ignora las mayúsculas y minúsculas: "YES".equalsIgnoreCase("yes") es true. No elimina espacios. Para aceptar también espacios alrededor, limpia la entrada antes de comparar.
Para una variable que podría ser null, llama al método desde un literal conocido que no sea null: "yes".equals(answer) devuelve false para null. answer.equals("yes") lanza NullPointerException si answer es null, porque ningún objeto recibe la llamada.
Un bucle de comandos puede comprobar !command.equals("quit"). El ! niega la igualdad de contenido. command != "quit" comprueba referencias y puede mantener un bucle en ejecución incluso cuando los caracteres escritos dicen «quit».
Interpreta el signo de compareTo
a.compareTo(b) compara valores char de UTF-16 en secuencia. Devuelve un número negativo si a va antes que b, cero si son iguales y un número positivo si va después. Solo el signo importa para ordenar; el resultado no tiene que ser exactamente -1 o 1.
| Comparación | Signo | Motivo |
|---|---|---|
"apple".compareTo("banana") | Negativo | El primer char diferente va antes |
"pear".compareTo("pear") | Cero | Todos los caracteres coinciden |
"car".compareTo("carpet") | Negativo | Prefijo igual, cadena más corta primero |
"10".compareTo("9") | Negativo | '1' va antes que '9' |
Por tanto, los números almacenados como texto no siguen el orden numérico. Conviértelos cuando la tarea sea numérica. Las letras mayúsculas inglesas sin tilde preceden a las minúsculas sin tilde, por lo que "Zebra" va antes que "apple". "Émile", con tilde, va después de "Zoe" en este orden. compareToIgnoreCase ignora las mayúsculas y minúsculas; el orden de diccionario específico de un idioma necesita java.text.Collator.
Reutiliza el patrón del mínimo para nombres
Para una lista no vacía [Mia, Ahmed, Lucia]:
String first = names.get(0);
for (String name : names) {
if (name.compareTo(first) < 0) {
first = name;
}
}
"Mia" comienza como candidata. "Ahmed" va antes en la comparación y pasa a ser el candidato; "Lucia" no lo sustituye. El resultado es "Ahmed". Comprueba si la lista está vacía antes de leer su primer elemento.
Un char individual es un primitivo, por lo que word.charAt(0) == 'A' es una comparación correcta de caracteres una vez que se sabe que la palabra no está vacía. El problema con == afecta a la identidad de los objetos, no a todas las comparaciones que incluyen texto.
Puntos clave
- Utiliza
equalspara el contenido de String yequalsIgnoreCasepara ignorar mayúsculas y minúsculas. - Un literal conocido puede recibir
equalsde forma segura cuando el argumento podría ser null. ==comprueba la identidad de String, incluso cuando compartir literales oculta el error.- Interpreta solo el signo de
compareTo. - La ordenación de cadenas de Java es el orden UTF-16, no el orden numérico ni el de diccionario específico de un idioma.
5.2 Construye y modifica texto con StringBuilder
Un StringBuilder contiene texto modificable. Es útil cuando un bucle añade muchas partes o cuando es necesario modificar caracteres in situ. Unas pocas uniones en una expresión son claras con +, pero reconstruir repetidamente una String que crece puede copiar su contenido acumulado muchas veces.
Añade partes y termina con una String
StringBuilder sb = new StringBuilder();
for (int i = 1; i <= 5; i++) {
if (i > 1) {
sb.append(", ");
}
sb.append(i);
}
String result = sb.toString();
No se necesita ninguna importación. append añade cadenas, chars, números o booleanos al final. La primera pasada añade solo 1; la segunda añade ", " y después 2. El resultado es "1, 2, 3, 4, 5". Poner un separador después de cada número dejaría un separador no deseado al final. Para una lista de cadenas existente, String.join(", ", list) gestiona directamente los separadores.
Repetir text += piece en un bucle forma resultados String inmutables nuevos. El prefijo acumulado debe incluirse cada vez, por lo que la cantidad copiada puede crecer de forma cuadrática a medida que crece un resultado largo. Un constructor mantiene un búfer modificable y añade contenido sin reconstruir todo el prefijo en cada pasada.
Modifica posiciones y rangos
| Método | Efecto |
|---|---|
insert(i, x) | Inserta en la posición i |
delete(start, end) | Elimina un rango, excluido end |
deleteCharAt(i) | Elimina un char |
setCharAt(i, c) | Sustituye un char |
replace(start, end, text) | Sustituye un rango, excluido end |
reverse() | Invierte el orden del constructor |
length() y charAt(i) leen el constructor como lo hacen con una String. Los índices describen su estado actual; una inserción o eliminación puede cambiar las posiciones posteriores.
Comienza con new StringBuilder("Jva"). insert(1, 'a') produce "Java"; después setCharAt(0, 'j') da "java". Para "2026-10-22", delete(4, 7) elimina las posiciones 4, 5 y 6, y deja "2026-22". Sustituir las posiciones de 7 a 9 en "I like tea" por "coffee" da "I like coffee".
Encadena solo los métodos que devuelven el constructor
new StringBuilder().append("a").append(1).append('b').toString() da "a1b". Las llamadas a append devuelven el mismo constructor, lo que permite otra llamada. Los métodos de modificación presentados aquí también devuelven el constructor, salvo setCharAt, que devuelve void y necesita una sentencia separada.
reverse() modifica el objeto receptor. Si sb contiene "stressed", entonces String r = sb.reverse().toString(); deja tanto r como el texto del constructor como "desserts". Para conservar el constructor original, invierte uno nuevo creado a partir de su texto.
Compara el contenido final
Para comprobar un palíndromo, añade la forma en minúscula de cada letra de "Was it a car or a cat I saw". El texto limpio es "wasitacaroracatisaw". Invierte un constructor nuevo que contenga ese texto, conviértelo en una String y compara con clean.equals(reversed). La comparación es true.
StringBuilder no sobrescribe equals para comparar contenido. Los constructores separados que contienen "abc" no son iguales según ese método y un constructor no es igual a una String. Convierte primero: sb1.toString().equals(sb2.toString()) compara el texto real.
Puntos clave
- Utiliza
appendpara construir un resultado largo ytoStringpara terminarlo. - Coloca separadores entre valores y evita un separador adicional al final.
- Las modificaciones cambian el constructor existente; los extremos finales de los rangos se excluyen.
setCharAtdevuelve void, por lo que no se puede encadenar.reversemodifica el constructor sobre el que se llama.- Convierte los constructores en Strings antes de comparar su contenido.
Ejemplos de Listas, arreglos y cadenas en Java
1Crea y comparte una lista de lecturas
13 pasos
- 1IntroducciónSigue una lista de lecturas que cambia
Una lista de lecturas puede comenzar vacía y crecer a medida que llegan sugerencias. Añadirás títulos, corregirás una entrada, eliminarás un duplicado y pasarás la lista a un método. Mantén separadas dos preguntas al seguir el código: ¿qué elemento ocupa ahora cada índice y qué variables hacen referencia al mismo objeto de lista? La primera explica los cambios de posición; la segunda explica las modificaciones compartidas.
- 2ExplicaciónCrea la colección vacía
Importa
java.util.ArrayListy crea la lista:ArrayList<String> reading = new ArrayList<>(); reading.add("Orbit"); reading.add("River");El tipo de elemento es String. La lista vacía crece hasta tener tamaño 2 y contiene
[Orbit, River]. El índice 0 identifica Orbit y el índice 1 identifica River. El diamante<>permite que Java infiera el tipo de elemento a partir del lado izquierdo. - 3EjemploInserta antes de un título almacenado
Continúa con la misma lista:
reading.add(1, "Cloud"); String old = reading.set(2, "Forest");La inserción desplaza River del índice 1 al índice 2 y da
[Orbit, Cloud, River]. Después, la sustitución cambia el índice 2 a Forest y devuelve River enold. La lista final es[Orbit, Cloud, Forest]. A diferencia de la inserción, la sustitución no ha cambiado el tamaño. - 4DesafíoEncuentra la siguiente posición válida
La lista es
[Orbit, Cloud, Forest]. ¿Qué ocurre si llamas areading.add(3, "Dune")? ¿Qué devolveríareading.get(3)después?---reveal---
La inserción añade Dune al final porque el índice
size()está permitido para insertar. El tamaño pasa a ser 4, por lo que el índice 3 es ahora válido para leer y devuelve"Dune". Leer el índice 3 antes de la inserción habría fallado. - 5ExplicaciónElimina un valor y sigue el desplazamiento
Añade otro Cloud y después elimina por valor:
reading.add("Cloud"); boolean removed = reading.remove("Cloud");La lista antes de la eliminación es
[Orbit, Cloud, Forest, Dune, Cloud]. Solo se elimina el primer Cloud, por lo que el resultado es[Orbit, Forest, Dune, Cloud]yremovedes true. Forest y todos los elementos posteriores se desplazan una posición a la izquierda. El último Cloud permanece en la lista. - 6ConsejoPregunta si existe o dónde está
Para
[Orbit, Forest, Dune, Cloud],contains("Orbit")es true eindexOf("Orbit")es 0. Una comprobación de coincidencia debe aceptar el índice 0: utilizaindex != -1después de guardar el resultado de la búsqueda. Un título ausente devuelve -1. Las búsquedas comparan el contenido de las Strings y distinguen mayúsculas de minúsculas, por lo que buscar"orbit"no encuentra"Orbit". UtilizalastIndexOfcuando importe la última posición que coincide. - 7DesafíoElimina un número por su valor
Un
ArrayList<Integer>independiente contiene[9, 1, 9]. Quieres eliminar el primer valor 9. ¿Qué llamada funciona y qué queda?---reveal---
numbers.remove(Integer.valueOf(9))selecciona la eliminación por valor y deja[1, 9].remove(9)seleccionaría el índice 9, que no es válido. El int primitivo selecciona un índice aunque la propia lista almacene enteros. - 8AnalogíaDos nombres para un cuaderno
Piensa en una referencia como una nota que indica dónde se guarda un cuaderno. Copiar la nota no crea otro cuaderno. Con
ArrayList<String> shared = reading;, ambas variables identifican una misma lista, por lo queshared.add("Coast")es visible a través dereading. En cambio, un constructor de copia,new ArrayList<>(reading), crea otra lista con sus propias posiciones. - 9EjemploCopia antes de modificar
Parte de
[Orbit, Forest, Dune, Cloud]:ArrayList<String> copy = new ArrayList<>(reading); copy.remove("Dune");La copia pasa a ser
[Orbit, Forest, Cloud], mientras que reading permanece sin cambios. Ambas listas hacían referencia inicialmente a los mismos elementos String inmutables, pero sus posiciones son independientes. Eliminar una posición de una no la elimina de la otra. - 10Idea claveUn parámetro es otro nombre local
Un método recibe una copia de una referencia de lista. Llamar a
titles.clear()mediante ese parámetro modifica la lista compartida. Asignartitles = new ArrayList<>();solo cambia el nombre local, por lo que quien llama conserva su lista anterior. Una lista vacía sigue siendo un objeto; null significa que no hay objeto. Llamar asize()sobre una lista vacía devuelve 0, mientras que llamarlo a través de null falla. - 11DesafíoDistingue las modificaciones compartidas de la reasignación local
La lista de quien llama es
[North, South]. El método ejecuta estas sentencias:titles.remove("North"); titles = new ArrayList<>(); titles.add("East");¿Qué sigue viendo quien llama?
---reveal---
Ve
[South]. La eliminación modifica primero el objeto compartido. Después, la reasignación solo hace que el parámetro del método apunte a otra lista, por lo que East se añade a una lista diferente. La referencia de quien llama nunca cambió de destino. - 12DesafíoCombina una copia, una búsqueda y una modificación
Supón que a contiene
[Lake, Hill]y ejecutab = new ArrayList<>(a),b.add("Lake")yb.remove(b.indexOf("Lake")). ¿Qué contienen a y b, y devuelve truea.equals(b)?---reveal---
La búsqueda devuelve el índice 0, por lo que b pasa a ser
[Hill, Lake]. La original a permanece como[Lake, Hill]. Los tamaños coinciden, pero el orden es diferente, por lo queequalsde la lista devuelve false. - 13RepasoPredice un cambio en una lista
Interpreta una modificación identificando primero su objetivo: una posición para
seto la eliminación por índice, un valor para la eliminación por valor y una posición de inserción paraadd. Después, actualiza los índices desplazados antes de seguir la siguiente llamada. Para predecir lo que ve otra variable, sigue si comparte la lista o contiene una copia independiente. La reasignación en un método afecta a su parámetro; las modificaciones afectan al objeto al que ese parámetro llega en ese momento.
2Almacena y copia lecturas fijas
10 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónAsigna una posición fija a cada lectura
- 2ExplicaciónReserva las posiciones
- 3EjemploImprime los datos que necesitas
- 4DesafíoLee la última posición
- 5EjemploSigue un alias
- 6EjemploCrea una copia más grande
- 7DesafíoElige una comparación de contenido
- 8EjemploGuarda antes de sobrescribir
- 9DesafíoConserva los datos anteriores al ampliar
- 10RepasoDistingue las modificaciones de posiciones del almacenamiento nuevo
3Convierte lecturas en resultados
17 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónAsigna una tarea clara a cada bucle
- 2ExplicaciónLee valores o posiciones
- 3DesafíoDeja espacio para el elemento siguiente
- 4EjemploMantén una suma a lo largo del bucle
- 5EjemploConserva la fracción al dividir
- 6Idea claveUn valor extremo necesita un candidato real
- 7DesafíoSigue el último máximo empatado
- 8ExplicaciónDetente solo cuando se conozca la respuesta
- 9EjemploEncuentra la primera lectura por encima de un límite
- 10DesafíoPasa de la primera coincidencia a todas las coincidencias
- 11EjemploObserva una omisión al eliminar hacia delante
- 12ExplicaciónRecorre en orden inverso para eliminar
- 13ConexiónConserva el origen mediante filtrado
- 14ConsejoUtiliza el iterador que controla el recorrido
- 15DesafíoLimita un bucle que añade al final
- 16DesafíoCalcula la media solo de los valores seleccionados
- 17RepasoSigue el estado y las reglas de parada
4Lee un registro de texto por etapas
14 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónDel texto sin procesar a los datos
- 2ExplicaciónLee un carácter cada vez
- 3EjemploCuenta dígitos en una etiqueta
- 4DesafíoConserva una transformación
- 5ExplicaciónLocaliza primero un límite
- 6EjemploCuenta las posiciones incluidas
- 7ConsejoElige la regla de limpieza
- 8DesafíoGestiona un separador ausente
- 9ExplicaciónDivide el registro en campos
- 10EjemploConvierte y calcula
- 11Idea claveLos separadores pueden describir patrones
- 12DesafíoConvierte después de comprobar la estructura
- 13DesafíoNormaliza palabras y únelas
- 14RepasoComprueba el tipo de resultado en cada etapa
5Compara comandos y prepara un informe
12 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónCompara el significado y construye un resultado
- 2ExplicaciónElige una comprobación de contenido
- 3EjemploIgnora las mayúsculas y minúsculas sin ignorar los espacios
- 4DesafíoExplica una prueba basada en literales
- 5ExplicaciónOrdena según el primer char diferente
- 6DesafíoConserva el candidato de texto que va primero
- 7ExplicaciónAñade a una secuencia modificable
- 8EjemploColoca separadores entre las partes
- 9EjemploModifica las posiciones actuales
- 10DesafíoConserva el orden original
- 11DesafíoConstruye un informe filtrado
- 12RepasoUtiliza la operación adecuada para la pregunta
Ejercicios de Listas, arreglos y cadenas en Java
Set 1: Crea, modifica y comparte colecciones10 Preguntas de Práctica
Pregunta 1 de 10
Mostrar respuestaOcultar respuesta
Integer es el tipo de elemento para una lista de valores enteros. ArrayList<int> no compila porque un primitivo no puede ser un argumento de tipo genérico. Un arreglo de longitud cero y una List.of() no modificable tampoco pueden proporcionar la lista que crece solicitada.Pregunta 2 de 10
¿Qué imprime esto?
ArrayList<String> tools = new ArrayList<>(List.of("pen", "ruler"));
tools.add(1, "tape");
String old = tools.set(2, "clip");
System.out.println(old + ": " + tools);
Mostrar respuestaOcultar respuesta
"ruler" al índice 2, por lo que set(2, "clip") lo sustituye y devuelve "ruler". La lista final es [pen, tape, clip]. Devolver "clip" confundiría el elemento nuevo con el valor anterior que devuelve set.Pregunta 3 de 10
ArrayList<Integer> contiene [12, 24, 36]. ¿Qué llamada elimina el valor 24?Mostrar respuestaOcultar respuesta
Integer.valueOf selecciona la eliminación por valor, por lo que la lista pasa a ser [12, 36]. Pasar el int primitivo 24 selecciona la eliminación por índice y falla porque el índice 24 no existe. Sustituir el índice 1 por 24 dejaría la lista sin cambios.Pregunta 4 de 10
[Nora, Ravi, Nora, Mei]. Después de names.remove("Nora"), ¿cuáles son los resultados de names.indexOf("Nora") y names.lastIndexOf("Mei"), en ese orden?Mostrar respuestaOcultar respuesta
"Nora" y deja [Ravi, Nora, Mei]. La Nora restante está en el índice 1 y Mei se ha desplazado al índice 2. Un resultado de -1 para Nora supondría que una eliminación borra todos los valores iguales.Pregunta 5 de 10
¿Cuál es el contenido de a y c después de este código?
ArrayList<String> a = new ArrayList<>(List.of("oak"));
ArrayList<String> b = a;
ArrayList<String> c = new ArrayList<>(a);
b.add("elm");
c.set(0, "ash");
Mostrar respuestaOcultar respuesta
b comparte una referencia con a, por lo que añadir mediante b modifica su única lista. El constructor de copia crea c antes de esa adición y la deja con una posición independiente. Esperar elm en c trataría una copia como un vínculo activo con las adiciones posteriores.Pregunta 6 de 10
Arrays.toString(new boolean[3])?Mostrar respuestaOcultar respuesta
false, y Arrays.toString las imprime todas. Null es el valor predeterminado de las posiciones que contienen referencias a objetos, no de los booleanos primitivos. Las posiciones ya existen aunque no se hayan asignado valores explícitamente.Pregunta 7 de 10
double[] readings tiene longitud 6. ¿Qué expresión lee su última posición?Mostrar respuestaOcultar respuesta
readings[5]. El índice 6 está una posición después del final y lanza una excepción. El acceso a arreglos utiliza corchetes y su length es un campo sin paréntesis.Pregunta 8 de 10
¿Cuál es el contenido de a y b después de este código?
int[] a = {7, 3};
int[] b = Arrays.copyOf(a, 3);
b[0] = 8;
Mostrar respuestaOcultar respuesta
a confundiría la copia con la referencia compartida creada por b = a.Pregunta 9 de 10
{6, 2}. ¿Cuáles son los resultados de a.equals(b) y Arrays.equals(a, b), en ese orden?Mostrar respuestaOcultar respuesta
equals de un arreglo hereda la comparación de identidad, por lo que los arreglos creados por separado no son iguales según esa llamada. Arrays.equals compara los valores correspondientes y devuelve true. Esperar que ambas llamadas devuelvan true aplica a un arreglo el comportamiento de igualdad de contenido de ArrayList.Pregunta 10 de 10
¿Qué contiene la lista de quien llama después de edit(a)?
static void edit(ArrayList<Integer> x) {
x.set(0, x.get(0) + 2);
x = new ArrayList<>(x);
x.add(9);
}
// In main:
ArrayList<Integer> a = new ArrayList<>(List.of(5, 8));
edit(a);
Mostrar respuestaOcultar respuesta
set inicial modifica la lista compartida de quien llama y cambia 5 por 7. Después, el parámetro pasa a apuntar a una copia independiente y solo esa copia recibe 9. Quien llama conserva [7, 8]; incluir 9 supondría incorrectamente que reasignar el parámetro también cambia el destino de la variable de quien llama.Set 2: Sigue bucles y procesa texto10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
for (int n : values) { n += 3; } sobre el arreglo {2, 6, 9}, ¿qué contiene el arreglo?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
[5, 8, 9]. Después de sumarla en un int total, ¿qué valor produce (double) (total / values.size())?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
Para la lista no vacía [-8, -3, -3, -6], ¿qué par imprime este código?
int best = 0;
int total = 0;
for (int i = 0; i < values.size(); i++) {
int n = values.get(i);
total += n;
if (n >= values.get(best)) {
best = i;
}
}
System.out.println(best + ": " + (double) total / values.size());
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
Se llama al método con {"Birch", "Cedar", "Maple"} y el valor buscado «Maple». ¿Qué devuelve?
static int find(String[] a, String target) {
for (int i = 0; i < a.length; i++) {
if (a[i].equals(target)) return i;
else return -1;
}
return -1;
}
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
¿Qué lista queda después de este bucle?
ArrayList<Integer> a = new ArrayList<>(List.of(4, 4, 7, 2));
for (int i = 0; i < a.size(); i++) {
if (a.get(i) % 2 == 0) a.remove(i);
}
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
"Count: " + 2 + 6?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
String code = "AB:472:Q";, ¿cuál es el resultado de code.substring(code.indexOf(":") + 1, code.lastIndexOf(":"))?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
"Mina;18;Oslo".split(";")?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
¿Cuántos campos produce esta expresión?
"x,y,,".split(",")
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
¿Qué se imprime?
String[] p = " Omar, 12, 5 ".trim().split(",");
int distanceKm = Integer.parseInt(p[1].trim());
int hours = Integer.parseInt(p[2].trim());
double speed = distanceKm / hours;
System.out.println(speed);
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Set 3: Compara valores y diagnostica errores10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
reply, que podría ser null, contiene exactamente «ready»?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
sb.append(3), ¿qué texto contiene?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
"18".compareTo("4") < 0 y por qué?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
¿Qué texto se almacena en result?
StringBuilder sb = new StringBuilder("plane");
sb.delete(1, 3);
sb.insert(1, "i");
String result = sb.toString();
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
¿Qué imprime este código?
String label = "lamp";
String other = label;
label = label.toUpperCase();
System.out.println(other + ":" + label);
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
¿Qué imprime esto?
String[] a = {"ax", "beta", "brim", "sun"};
int first = -1;
int matches = 0;
for (int i = 0; i < a.length; i++) {
if (a[i].startsWith("b")) {
if (first == -1) first = i;
matches++;
}
}
System.out.println(first + ":" + matches);
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
¿Qué lista queda después de este código?
ArrayList<Integer> a = new ArrayList<>(List.of(2, 5, 2));
for (int i = a.size() - 1; i >= 0; i--) {
if (a.get(i) == 2) a.remove(i);
}
int n = a.size();
for (int i = 0; i < n; i++) {
a.add(a.get(i) * 2);
}
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
¿Qué contienen a y b después de ejecutar el código?
int[] a = {11, 4, 8};
int[] b = a;
int temp = b[0];
b[0] = b[2];
b[2] = temp;
b = Arrays.copyOf(b, 4);
b[1] = 0;
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
names.indexOf("Iris") >= 0 antes de llamar a get con ese resultado. ¿Qué ocurre?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
¿Qué se imprime?
StringBuilder a = new StringBuilder("drawer");
StringBuilder b = a;
String result = b.reverse().toString();
b = new StringBuilder("x");
System.out.println(a + ":" + result);
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Set 4: Combina operaciones de colecciones y texto10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
" ".isEmpty() y " ".isBlank(), en ese orden?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
¿Cuáles son las partes de esta expresión?
" north east west ".trim().split("\\s+")
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
["zen", "Able", "apple"]. Un bucle conserva el primer candidato y lo sustituye cuando name.compareTo(first) < 0. ¿Qué nombre queda?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
ArrayList<String> tiene tamaño 4. ¿Qué ocurre cuando a add(4, "new") le sigue get(4)?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
¿Cuáles son la lista out y la media finales?
int[] a = {-2, 6, 10, 0};
ArrayList<Integer> out = new ArrayList<>();
int sum = 0;
for (int n : a) {
if (n > 0) {
out.add(n);
sum += n;
}
}
double average = (double) sum / out.size();
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
¿Qué índice se devuelve para la entrada mostrada?
static int firstLong(String[] words, int min) {
for (int i = 0; i < words.length; i++) {
String clean = words[i].trim();
if (clean.length() >= min) return i;
}
return -1;
}
// Call:
firstLong(new String[] {" ox ", "pine", " map ", "cedar"}, 4)
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
¿Qué contienen a y kept después de este código?
ArrayList<Integer> a = new ArrayList<>(List.of(2, -1, -1, 5));
ArrayList<Integer> kept = new ArrayList<>(a);
for (int i = kept.size() - 1; i >= 0; i--) {
if (kept.get(i) < 0) kept.remove(i);
}
a.set(0, 9);
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
El método debe devolver el texto posterior al primer «#» o «missing» cuando no hay marcador. ¿Qué sustitución hace que el método funcione tanto para la entrada «tag#blue» como para «plain»?
static String tail(String s) {
int p = s.indexOf("#");
MISSING
}
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
¿Qué String devuelve el método para el arreglo {"A", "B", "C"}?
static String report(String[] parts) {
StringBuilder sb = new StringBuilder();
for (int i = parts.length - 1; i >= 0; i--) {
if (sb.length() > 0) sb.append("/");
sb.append(parts[i]);
}
sb.deleteCharAt(2);
return sb.toString();
}
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
¿Qué contienen a y b después de change(a)?
static void change(ArrayList<String> x) {
x.remove("red");
x = new ArrayList<>();
x.add("gold");
}
// In main:
ArrayList<String> a = new ArrayList<>(List.of("red", "blue", "red"));
ArrayList<String> b = a;
change(a);
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
¿Te atascas con una pregunta tuya? Ayuda con Tareas
Términos Clave
A
Acumulador
Adición al final
Alias
b = a, b es un alias de a; b.clear() vacía la lista a la que se accede mediante ambas variables.Análisis sintáctico
Integer.parseInt falla porque ese método acepta texto de enteros sin separador decimal.Arreglo
B
Bucle con índice
names.get(i) y mostrar i + 1.Bucle for-each
Búsqueda lineal
C
Cadena de caracteres (String)
Campo de datos
Campo length
new int[4] es 4 incluso antes de que el programa escriba valores propios en sus posiciones.Caracteres de espacio en blanco
Character.isWhitespace, que también utilizan strip() e isBlank().char
"book".charAt(0) es 'b', mientras que "b" es una String de longitud 1.Clase ArrayList
Clase envoltorio
Integer permite que un ArrayList<Integer> almacene números proporcionados como valores int.Clase StringBuilder
Comparación de contenido
reply.equals("go") reconoce texto coincidente incluso cuando los objetos son distintos.Comparación de identidad
a == b es false para arreglos separados que contienen los mismos enteros.Comparación que distingue mayúsculas y minúsculas
equals de String determina que «Go» y «go» tienen contenido diferente.Concatenación
+ procede de izquierda a derecha salvo que los paréntesis cambien la agrupación."N=" + 2 + 5 produzca "N=25", ya que los números se unen una vez que comienza el texto.Copia de arreglo
Arrays.copyOf(a, 5) puede ampliar el almacenamiento sin cambiar la longitud de a.Copia superficial
D
Desempaquetado
int first = numbers.get(0); lee un elemento Integer de una lista.División de cadenas
División entera
17 / 4 sea igual a 4; convertir explícitamente un operando primero permite obtener el resultado fraccionario 4,25.E
Eliminación en orden inverso
Eliminación por índice
[a, b, c] a [a, c] cuando remove(1) borra el elemento central.Eliminación por valor
[a, b, a] después de que remove("a") elimina la primera a.Empaquetado automático
numbers.add(8) aunque el tipo de elemento de la lista sea Integer, no int.Encadenamiento de métodos
sb.append("x").append(2), pero no puede continuar desde setCharAt, que devuelve void.Excepción ArrayIndexOutOfBoundsException
Excepción ConcurrentModificationException
Excepción NumberFormatException
Integer.parseInt(" 18") porque no se acepta el espacio inicial.Expresión regular
Extremo final excluido
substring(2, 5) incluye las posiciones 2, 3 y 4, pero deja fuera la posición 5.F
Filtro
Í
Índice
get(3) lee ese elemento.I
Igualdad de contenido
Arrays.equals(a, b), no con equals del arreglo.Inicializador de arreglo
int[] a = {3, 6, 9}; crea tres posiciones que contienen esos valores.Inmutabilidad
toUpperCase().Iterador
it.remove() mientras continúa por la lista.L
Límite de bucle
i < a.length - 1 deja espacio para leer el elemento vecino de la derecha en a[i + 1].Lista no modificable
List.of("east", "west") rechaza una llamada posterior a set.M
Máximo
{-7, -2, -5} es -2, que no se obtendría si el mejor valor se inicializara en cero.Método compareTo
Método sobrecargado
Modificación estructural
Modificación in situ
reverse() cambia el constructor original, por lo que los alias también ven el texto invertido.O
Orden lexicográfico
P
Palíndromo
Paso por valor
Predicado de búsqueda
city.startsWith("M") encuentra nombres mediante una condición en lugar de un único valor exacto.R
Recorrido
Recuento condicional
Referencia
Resultado de búsqueda
names.indexOf("Kai") puede ser 0, por lo que una comprobación de coincidencia debe aceptar ese índice.Retorno anticipado
S
Subcadena
"planet" se selecciona con substring(1, 4) y es «lan».Sustitución literal
replace(".", "-") cambia los puntos de «a.b.c» por guiones.U
Unidad de código UTF-16
length() de String.Unión de cadenas
String.join("/", pieces) convierte las partes «a», «b» y «c» en el texto «a/b/c».V
Valor centinela
Valor no numérico (NaN)
0.0 / 0 produce NaN en lugar de una medida útil.Valor null
length() sobre una String que una búsqueda podría devolver.Valor predeterminado
Variable temporal
- 1Primeros programas en Java
- 2Condiciones y bucles en Java
- 3Métodos en Java
- 4Listas, arreglos y cadenas en Java
- 5Clases y objetos en Java
- 6Objetos y referencias en Java
- 7HashMap y colecciones en Java
- 8Herencia, interfaces y polimorfismo en Java
- 9Excepciones y archivos en Java
- 10Paquetes en Java
- 11Genéricos y expresiones lambda en Java
Sobre esta unidad
Crea tus propios Materiales de Estudio
Convierte tus notas, diapositivas y documentos en Guías de Estudio, Preguntas de Práctica, Flashcards y 6 herramientas más.