Listas, arreglos y cadenas en Java

Aprende a almacenar muchos valores en Java y a trabajar con texto. Crea ArrayLists y arreglos, añade, modifica, elimina y busca sus elementos, y procésalos con bucles con índice y bucles for-each para calcular totales, medias y máximos. Después, trabaja con texto mediante métodos de String: busca y extrae partes, divide líneas en campos, compara cadenas correctamente con equals y construye textos más largos de forma eficiente con StringBuilder.

PrincipianteUnidad 4 de 11 del curso Curso de Programación orientada a objetos con Java

Lo que aprenderás

  1. 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 índices
      Importa 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 lista
      Elimina 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étodos
      Explica 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.
  2. 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 elementos
      Declara 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 listas
      Explica las referencias a arreglos, copia y compara arreglos correctamente, intercambia elementos y decide cuándo conviene usar un arreglo o un ArrayList.
  3. 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-each
      Escribe 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 extremos
      Utiliza 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 arreglo
      Escribe 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 recorres
      Elimina o añade elementos durante un bucle sin omitir elementos ni provocar una excepción, y elige una forma segura de hacerlo.
  4. 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 cadena
      Utiliza 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 cadena
      Localiza 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úmeros
      Divide una línea en campos con split, convierte campos en números y números en texto, comprueba las partes y vuelve a unirlas.
  5. 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 compareTo
      Utiliza 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 StringBuilder
      Utiliza StringBuilder para construir texto en un bucle y modificarlo in situ, convierte el resultado en una String y evita los errores habituales con StringBuilder.

Guía de estudio de Listas, arreglos y cadenas en Java

5 capítulos

1

Almacena 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.

TareaLlamadaÍndice válido
Leer un elementoget(i)De 0 a size() - 1
Sustituir un elementoset(i, value)De 0 a size() - 1
Insertar un elementoadd(i, value)De 0 a size()
Añadir un elemento al finaladd(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.
  • set sustituye; add con índice inserta y desplaza los elementos posteriores.
  • Utiliza tipos envoltorio como Integer en 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
LlamadaSignificadoResultado devuelto
remove(int index)Elimina el elemento de una posiciónEl elemento eliminado
remove(Object value)Elimina el primer valor igualtrue 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.
  • indexOf y lastIndexOf devuelven -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.
  • equals de una lista compara el contenido ordenado; == compara la identidad.
  • Una lista vacía permite la iteración; null no hace referencia a ninguna lista.
2

Almacena 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.

EstructuraNúmero de elementosLeer un elemento
Arregloa.lengtha[i]
ArrayLista.size()a.get(i)
Strings.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 y a.length para 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
NecesidadOpción adecuada
Una posición fija para cada día o mesArreglo
Valores primitivos sin envoltoriosArreglo
Añadir o eliminar elementos a medida que llegan datosArrayList

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; copyOf o clone crea una copia.
  • Utiliza Arrays.equals para 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.
3

Procesa 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 + 1 requiere i < 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 remove de 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.
4

Trabaja 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ónResultado
"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 en length() - 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 Character comprueban 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étodoEfecto
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.
  • replace sustituye texto literal; trim y strip actúan en los extremos.
  • isBlank acepta texto formado solo por espacios en blanco, mientras que isEmpty requiere 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

  • split devuelve 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.join para partes de texto y métodos de análisis para números.
5

Compara 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ónSignoMotivo
"apple".compareTo("banana")NegativoEl primer char diferente va antes
"pear".compareTo("pear")CeroTodos los caracteres coinciden
"car".compareTo("carpet")NegativoPrefijo 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 equals para el contenido de String y equalsIgnoreCase para ignorar mayúsculas y minúsculas.
  • Un literal conocido puede recibir equals de 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étodoEfecto
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 append para construir un resultado largo y toString para 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.
  • setCharAt devuelve void, por lo que no se puede encadenar.
  • reverse modifica 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

5 Lecciones Interactivas

1

Crea y comparte una lista de lecturas

13 pasos
Crea una lista, sigue los cambios en sus posiciones y determina qué modificaciones comparte otra variable.
  1. 1
    Introducció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.

  2. 2
    ExplicaciónCrea la colección vacía

    Importa java.util.ArrayList y 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.

  3. 3
    EjemploInserta 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 en old. La lista final es [Orbit, Cloud, Forest]. A diferencia de la inserción, la sustitución no ha cambiado el tamaño.

  4. 4
    DesafíoEncuentra la siguiente posición válida

    La lista es [Orbit, Cloud, Forest]. ¿Qué ocurre si llamas a reading.add(3, "Dune")? ¿Qué devolvería reading.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.

  5. 5
    Explicació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] y removed es true. Forest y todos los elementos posteriores se desplazan una posición a la izquierda. El último Cloud permanece en la lista.

  6. 6
    ConsejoPregunta si existe o dónde está

    Para [Orbit, Forest, Dune, Cloud], contains("Orbit") es true e indexOf("Orbit") es 0. Una comprobación de coincidencia debe aceptar el índice 0: utiliza index != -1 despué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". Utiliza lastIndexOf cuando importe la última posición que coincide.

  7. 7
    Desafí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.

  8. 8
    Analogí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 que shared.add("Coast") es visible a través de reading. En cambio, un constructor de copia, new ArrayList<>(reading), crea otra lista con sus propias posiciones.

  9. 9
    EjemploCopia 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.

  10. 10
    Idea 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. Asignar titles = 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 a size() sobre una lista vacía devuelve 0, mientras que llamarlo a través de null falla.

  11. 11
    Desafí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.

  12. 12
    DesafíoCombina una copia, una búsqueda y una modificación

    Supón que a contiene [Lake, Hill] y ejecuta b = new ArrayList<>(a), b.add("Lake") y b.remove(b.indexOf("Lake")). ¿Qué contienen a y b, y devuelve true a.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 que equals de la lista devuelve false.

  13. 13
    RepasoPredice un cambio en una lista

    Interpreta una modificación identificando primero su objetivo: una posición para set o la eliminación por índice, un valor para la eliminación por valor y una posición de inserción para add. 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.

2

Almacena y copia lecturas fijas

10 pasos
Utiliza posiciones fijas de arreglo, inspecciona los valores predeterminados y conserva los datos al copiar e intercambiar.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónAsigna una posición fija a cada lectura
  2. 2
    ExplicaciónReserva las posiciones
  3. 3
    EjemploImprime los datos que necesitas
  4. 4
    DesafíoLee la última posición
  5. 5
    EjemploSigue un alias
  6. 6
    EjemploCrea una copia más grande
  7. 7
    DesafíoElige una comparación de contenido
  8. 8
    EjemploGuarda antes de sobrescribir
  9. 9
    DesafíoConserva los datos anteriores al ampliar
  10. 10
    RepasoDistingue las modificaciones de posiciones del almacenamiento nuevo
3

Convierte lecturas en resultados

17 pasos
Sigue el estado de los bucles, calcula una media, busca por una condición y elimina valores no deseados de forma segura.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónAsigna una tarea clara a cada bucle
  2. 2
    ExplicaciónLee valores o posiciones
  3. 3
    DesafíoDeja espacio para el elemento siguiente
  4. 4
    EjemploMantén una suma a lo largo del bucle
  5. 5
    EjemploConserva la fracción al dividir
  6. 6
    Idea claveUn valor extremo necesita un candidato real
  7. 7
    DesafíoSigue el último máximo empatado
  8. 8
    ExplicaciónDetente solo cuando se conozca la respuesta
  9. 9
    EjemploEncuentra la primera lectura por encima de un límite
  10. 10
    DesafíoPasa de la primera coincidencia a todas las coincidencias
  11. 11
    EjemploObserva una omisión al eliminar hacia delante
  12. 12
    ExplicaciónRecorre en orden inverso para eliminar
  13. 13
    ConexiónConserva el origen mediante filtrado
  14. 14
    ConsejoUtiliza el iterador que controla el recorrido
  15. 15
    DesafíoLimita un bucle que añade al final
  16. 16
    DesafíoCalcula la media solo de los valores seleccionados
  17. 17
    RepasoSigue el estado y las reglas de parada
4

Lee un registro de texto por etapas

14 pasos
Inspecciona caracteres, extrae una parte identificada y divide un registro en campos numéricos.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónDel texto sin procesar a los datos
  2. 2
    ExplicaciónLee un carácter cada vez
  3. 3
    EjemploCuenta dígitos en una etiqueta
  4. 4
    DesafíoConserva una transformación
  5. 5
    ExplicaciónLocaliza primero un límite
  6. 6
    EjemploCuenta las posiciones incluidas
  7. 7
    ConsejoElige la regla de limpieza
  8. 8
    DesafíoGestiona un separador ausente
  9. 9
    ExplicaciónDivide el registro en campos
  10. 10
    EjemploConvierte y calcula
  11. 11
    Idea claveLos separadores pueden describir patrones
  12. 12
    DesafíoConvierte después de comprobar la estructura
  13. 13
    DesafíoNormaliza palabras y únelas
  14. 14
    RepasoComprueba el tipo de resultado en cada etapa
5

Compara comandos y prepara un informe

12 pasos
Elige comparaciones de contenido, interpreta el orden del texto y construye un resultado modificable sin perder el original.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónCompara el significado y construye un resultado
  2. 2
    ExplicaciónElige una comprobación de contenido
  3. 3
    EjemploIgnora las mayúsculas y minúsculas sin ignorar los espacios
  4. 4
    DesafíoExplica una prueba basada en literales
  5. 5
    ExplicaciónOrdena según el primer char diferente
  6. 6
    DesafíoConserva el candidato de texto que va primero
  7. 7
    ExplicaciónAñade a una secuencia modificable
  8. 8
    EjemploColoca separadores entre las partes
  9. 9
    EjemploModifica las posiciones actuales
  10. 10
    DesafíoConserva el orden original
  11. 11
    DesafíoConstruye un informe filtrado
  12. 12
    RepasoUtiliza la operación adecuada para la pregunta

Ejercicios de Listas, arreglos y cadenas en Java

40 Preguntas de Práctica en 4 sets

Set 1: Crea, modifica y comparte colecciones10 Preguntas de Práctica

Pregunta 1 de 10

¿Qué declaración crea una lista vacía y modificable de valores enteros? Supón que ArrayList y List están importados.
  1. ArrayList<int> n = new ArrayList<>();
  2. Integer[] n = new Integer[0];
  3. ArrayList<Integer> n = new ArrayList<>();
  4. List<Integer> n = List.of();
Mostrar respuestaOcultar respuesta
Respuesta: C
El tipo envoltorio 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);
  1. ruler: [pen, tape, clip]
  2. tape: [pen, clip, ruler]
  3. ruler: [pen, clip, tape]
  4. clip: [pen, tape, clip]
Mostrar respuestaOcultar respuesta
Respuesta: A
Insertar en el índice 1 desplaza "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

Un ArrayList<Integer> contiene [12, 24, 36]. ¿Qué llamada elimina el valor 24?
  1. values.remove(24);
  2. values.remove(Integer.valueOf(1));
  3. values.set(1, 24);
  4. values.remove(Integer.valueOf(24));
Mostrar respuestaOcultar respuesta
Respuesta: D
Envolver 24 con 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

Una lista de nombres contiene [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?
  1. 0 and 3
  2. 1 and 2
  3. -1 and 2
  4. 2 and 3
Mostrar respuestaOcultar respuesta
Respuesta: B
La eliminación por valor elimina solo la primera "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");
  1. a: [oak]; c: [ash]
  2. a: [oak, elm]; c: [ash]
  3. a: [ash, elm]; c: [ash, elm]
  4. a: [oak, elm]; c: [ash, elm]
Mostrar respuestaOcultar respuesta
Respuesta: B
La asignación a 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

¿Qué devuelve Arrays.toString(new boolean[3])?
  1. "[null, null, null]"
  2. "[0, 0, 0]"
  3. "[]"
  4. "[false, false, false]"
Mostrar respuestaOcultar respuesta
Respuesta: D
Un arreglo boolean nuevo tiene tres posiciones, cada una inicializada en 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

Un double[] readings tiene longitud 6. ¿Qué expresión lee su última posición?
  1. readings[5]
  2. readings[6]
  3. readings.get(5)
  4. readings[readings.length()]
Mostrar respuestaOcultar respuesta
Respuesta: A
Las seis posiciones del arreglo utilizan los índices de 0 a 5, por lo que la última es 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;
  1. a: [8, 3]; b: [8, 3, 0]
  2. a: [7, 3]; b: [8, 3]
  3. a: [7, 3]; b: [8, 3, 0]
  4. a: [7, 3, 0]; b: [8, 3, 0]
Mostrar respuestaOcultar respuesta
Respuesta: C
La copia es un arreglo nuevo de tres posiciones, con la posición int adicional inicializada en 0. Modificar su primera posición deja el arreglo original de dos posiciones sin cambios. Mostrar 8 en a confundiría la copia con la referencia compartida creada por b = a.

Pregunta 9 de 10

Dos arreglos creados por separado contienen cada uno {6, 2}. ¿Cuáles son los resultados de a.equals(b) y Arrays.equals(a, b), en ese orden?
  1. false, true
  2. true, true
  3. true, false
  4. false, false
Mostrar respuestaOcultar respuesta
Respuesta: A
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);
  1. [5, 8]
  2. [7, 8, 9]
  3. [7, 8]
  4. [5, 8, 9]
Mostrar respuestaOcultar respuesta
Respuesta: C
El 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

Después de ejecutar for (int n : values) { n += 3; } sobre el arreglo {2, 6, 9}, ¿qué contiene el arreglo?
  1. [5, 9, 12]
  2. [3, 3, 3]
  3. [9, 9, 9]
  4. [2, 6, 9]
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 2 de 10

Una lista de enteros contiene [5, 8, 9]. Después de sumarla en un int total, ¿qué valor produce (double) (total / values.size())?
  1. 7.333333333333333
  2. 7.0
  3. 22.0
  4. 3.0
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());
  1. 2: -5.0
  2. 1: -5.0
  3. 2: -3.0
  4. 0: -5.0
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;
}
  1. 0
  2. 2
  3. -1
  4. 3
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);
}
  1. [7]
  2. [4, 7]
  3. [4, 7, 2]
  4. [4, 4, 7]
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 6 de 10

¿Qué produce "Count: " + 2 + 6?
  1. "Count: 26"
  2. "Count: 8"
  3. "8Count: "
  4. "Count: 2 6"
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 7 de 10

Para String code = "AB:472:Q";, ¿cuál es el resultado de code.substring(code.indexOf(":") + 1, code.lastIndexOf(":"))?
  1. ":472"
  2. "472:"
  3. "47"
  4. "472"
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 8 de 10

¿Qué tipo devuelve "Mina;18;Oslo".split(";")?
  1. ArrayList<String>
  2. String
  3. String[]
  4. int[]
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 9 de 10

¿Cuántos campos produce esta expresión?

"x,y,,".split(",")
  1. 3
  2. 4
  3. 2
  4. 1
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);
  1. 2.4
  2. 12.5
  3. NumberFormatException
  4. 2.0
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

¿Qué expresión comprueba de forma segura si una String llamada reply, que podría ser null, contiene exactamente «ready»?
  1. reply.equals("ready")
  2. "ready".equals(reply)
  3. reply == "ready"
  4. reply.compareTo("ready") == 0
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 2 de 10

Un constructor contiene «note». Después de sb.append(3), ¿qué texto contiene?
  1. "note"
  2. "3note"
  3. "note 3"
  4. "note3"
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 3 de 10

¿Qué resultado da "18".compareTo("4") < 0 y por qué?
  1. true; the first character decides the order
  2. false; eighteen is greater than four
  3. true; two-character strings always come first
  4. false; the longer string always comes later
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();
  1. "pie"
  2. "pilane"
  3. "pine"
  4. "pline"
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);
  1. Ambas variables conservan su texto original en minúsculas.
  2. Ambas variables hacen referencia al resultado en mayúsculas.
  3. El original pasa a mayúsculas; el resultado nuevo permanece en minúsculas.
  4. El original permanece en minúsculas; la variable reasignada está en mayúsculas.
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);
  1. 1:2
  2. 2:2
  3. 1:1
  4. -1:2
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);
}
  1. [5, 2, 10, 4]
  2. [5]
  3. [5, 10]
  4. [2, 5, 2, 4, 10, 4]
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;
  1. a: [11, 4, 8]; b: [8, 0, 11, 0]
  2. a: [8, 4, 11]; b: [8, 0, 11, 0]
  3. a: [8, 0, 11]; b: [8, 0, 11, 0]
  4. a: [8, 4, 8]; b: [8, 0, 8, 0]
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 9 de 10

Una lista está vacía. Un programa comprueba names.indexOf("Iris") >= 0 antes de llamar a get con ese resultado. ¿Qué ocurre?
  1. La condición es falsa, por lo que se omite get.
  2. La condición es verdadera y get devuelve null.
  3. indexOf lanza una excepción porque la lista está vacía.
  4. La condición es verdadera y get lanza una excepción.
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);
  1. drawer:reward
  2. x:reward
  3. reward:reward
  4. reward:drawer
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

¿Cuáles son los resultados de " ".isEmpty() y " ".isBlank(), en ese orden?
  1. true, true
  2. false, false
  3. false, true
  4. true, false
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+")
  1. [north, east, west]
  2. [, north, east, west]
  3. [north, , , east, west]
  4. [north east west]
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 3 de 10

Una lista de nombres no vacía contiene ["zen", "Able", "apple"]. Un bucle conserva el primer candidato y lo sustituye cuando name.compareTo(first) < 0. ¿Qué nombre queda?
  1. apple, porque la comparación ignora las mayúsculas y minúsculas
  2. Able, porque su primer char precede a los caracteres en minúsculas
  3. zen, porque los candidatos posteriores nunca van antes que él
  4. Ninguno, porque comparar mayúsculas con minúsculas lanza una excepción
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 4 de 10

Un ArrayList<String> tiene tamaño 4. ¿Qué ocurre cuando a add(4, "new") le sigue get(4)?
  1. The insertion throws; get is never reached.
  2. The insertion succeeds; get throws afterward.
  3. The insertion replaces the old final element.
  4. The insertion succeeds; get returns "new".
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();
  1. [6, 10] and 4.0
  2. [6, 10] and 8.0
  3. [-2, 6, 10, 0] and 3.5
  4. [6, 10, 0] and 5.333333333333333
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)
  1. 0
  2. 3
  3. -1
  4. 1
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);
  1. a: [9, -1, -1, 5]; kept: [2, 5]
  2. a: [9, 5]; kept: [9, 5]
  3. a: [9, -1, -1, 5]; kept: [9, 5]
  4. a: [9, -1, -1, 5]; kept: [2, -1, 5]
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
}
  1. if (p == 0) return "missing"; return s.substring(p + 1);
  2. if (p == -1) return "missing"; return s.substring(p);
  3. if (p == -1) return "missing"; return s.substring(p + 1);
  4. if (p > 0) return "missing"; return s.substring(p + 1);
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();
}
  1. "C/B/A"
  2. "C/BA"
  3. "A//C"
  4. "C//A"
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);
  1. a: [gold]; b: [blue, red]
  2. a: [blue, red]; b: [blue, red]
  3. a: [blue]; b: [blue]
  4. a: [red, blue, red]; b: [red, blue, red]
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

¿Te atascas con una pregunta tuya? Ayuda con Tareas

Términos Clave

66 Términos Clave, cada uno con su definición

A

Acumulador
Un acumulador almacena un resultado construido a lo largo de las pasadas de un bucle: se inicializa antes del bucle y cambia al procesar los elementos relevantes.
Un acumulador de suma comienza en 0 y añade cada distancia para que el programa pueda indicar el total de kilómetros.
Adición al final
Una adición al final añade la representación textual de un valor al final de un StringBuilder y devuelve ese mismo constructor para llamadas posteriores.
Añadir 4 después de «Page » cambia el constructor a «Page 4» sin una reasignación separada.
Alias
Un alias es otra variable o nombre que hace referencia al mismo objeto, por lo que las modificaciones mediante un nombre son visibles mediante el otro.
Después de 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
El análisis sintáctico convierte texto en un valor estructurado, como un int o un double, según la sintaxis aceptada por el método elegido.
Convertir «3.5» con Integer.parseInt falla porque ese método acepta texto de enteros sin separador decimal.
Arreglo
Un arreglo es un objeto con un número fijo de posiciones del mismo tipo, a las que se accede mediante índices que comienzan en cero y corchetes.
Un arreglo de siete doubles puede almacenar una temperatura en grados Celsius para cada día de una semana.

B

Bucle con índice
Un bucle con índice visita elementos mediante una variable de posición explícita, lo que permite al cuerpo leer posiciones o sustituir valores almacenados.
Un bucle con índice puede imprimir nombres con números de línea al leer names.get(i) y mostrar i + 1.
Bucle for-each
Un bucle for-each visita cada valor de elemento en orden sin un índice explícito y coloca ese valor en una variable local de bucle.
Un bucle for-each puede sumar valores de un arreglo, pero reasignar su variable int no sustituye las posiciones del arreglo.
Búsqueda lineal
Una búsqueda lineal comprueba los elementos uno por uno hasta que una coincidencia responde a la pregunta o el final establece que ningún elemento coincide.
Una búsqueda lineal de un nombre ausente entre 14 entradas comprueba las 14 antes de devolver su indicador de ausencia.

C

Cadena de caracteres (String)
Una String es un objeto inmutable de Java que representa texto como una secuencia de valores char de UTF-16 a los que se accede mediante posiciones que comienzan en cero.
Una String que contiene un nombre se puede compartir de forma segura porque convertirlo a mayúsculas o minúsculas no modifica el objeto original.
Campo de datos
Un campo de datos es una parte de datos de un registro, a menudo separada de las partes vecinas por un delimitador como una coma o un punto y coma.
El segundo campo de «Ari,18,4» debe convertirse si un programa necesita su valor numérico para un cálculo.
Campo length
El campo length indica el número fijo de posiciones de un arreglo y se lee sin los paréntesis utilizados para llamar a un método.
El campo length de new int[4] es 4 incluso antes de que el programa escriba valores propios en sus posiciones.
Caracteres de espacio en blanco
Los caracteres de espacio en blanco son caracteres de separación reconocidos por una comprobación determinada, incluidos espacios, tabulaciones y saltos de línea.
Los espacios en blanco de Java se reconocen con Character.isWhitespace, que también utilizan strip() e isBlank().
char
Un char es un valor primitivo de Java que almacena una unidad de código UTF-16 y se escribe como un literal de carácter entre comillas simples.
El char devuelto por "book".charAt(0) es 'b', mientras que "b" es una String de longitud 1.
Clase ArrayList
Un ArrayList es una lista ordenada y modificable cuya cantidad de elementos crece o disminuye a medida que se añaden o eliminan valores.
Un ArrayList puede recopilar nombres a medida que las personas los introducen sin necesitar de antemano una cantidad final.
Clase envoltorio
Una clase envoltorio representa un valor primitivo como un objeto, lo que permite utilizar valores como los enteros como elementos de una lista.
La clase envoltorio Integer permite que un ArrayList<Integer> almacene números proporcionados como valores int.
Clase StringBuilder
Un StringBuilder es una secuencia modificable de caracteres que permite añadir repetidamente de forma eficiente y modificar posiciones o rangos actuales.
Un StringBuilder puede preparar un informe de varias líneas sin reconstruir todo el prefijo después de cada línea añadida.
Comparación de contenido
Una comparación de contenido comprueba los caracteres o valores almacenados en objetos y permite que objetos String separados coincidan cuando su texto es igual.
Una comparación de contenido con reply.equals("go") reconoce texto coincidente incluso cuando los objetos son distintos.
Comparación de identidad
Una comparación de identidad comprueba si unas referencias identifican el mismo objeto, independientemente de que objetos separados contengan datos iguales.
Una comparación de identidad con a == b es false para arreglos separados que contienen los mismos enteros.
Comparación que distingue mayúsculas y minúsculas
Una comparación que distingue mayúsculas y minúsculas trata las letras mayúsculas y minúsculas como distintas al determinar si un texto coincide.
Una comparación que distingue mayúsculas y minúsculas con equals de String determina que «Go» y «go» tienen contenido diferente.
Concatenación
La concatenación une valores en texto; en Java, la suma de String con + procede de izquierda a derecha salvo que los paréntesis cambien la agrupación.
La concatenación hace que "N=" + 2 + 5 produzca "N=25", ya que los números se unen una vez que comienza el texto.
Copia de arreglo
Una copia de arreglo es un arreglo independiente cuyos valores proceden de otro arreglo, opcionalmente con una longitud diferente y posiciones adicionales llenas con valores predeterminados.
Una copia de arreglo creada con Arrays.copyOf(a, 5) puede ampliar el almacenamiento sin cambiar la longitud de a.
Copia superficial
Una copia superficial crea un contenedor independiente y copia los valores o referencias de sus elementos sin duplicar los objetos referenciados.
Una copia superficial de una lista de cadenas tiene posiciones de lista independientes que siguen haciendo referencia a los mismos objetos String.

D

Desempaquetado
El desempaquetado es la conversión automática que hace Java del valor almacenado en un objeto envoltorio al tipo primitivo correspondiente.
El desempaquetado proporciona un int cuando int first = numbers.get(0); lee un elemento Integer de una lista.
División de cadenas
Una operación de división de cadenas divide texto donde coincide un patrón separador y devuelve un arreglo de partes de texto sin los propios separadores.
Una división por comas convierte «Nia,25,Lima» en tres cadenas, incluido el texto numérico que aún no se ha convertido.
División entera
La división entera divide operandos enteros y descarta la parte fraccionaria, incluso cuando el cociente resultante se almacena después como double.
La división entera hace que 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
La eliminación en orden inverso visita los índices de una lista del último al primero, de modo que cada eliminación desplaza solo elementos que el bucle ya ha comprobado.
La eliminación en orden inverso borra valores negativos contiguos sin omitir el que se desplaza a la izquierda tras una eliminación.
Eliminación por índice
La eliminación por índice borra el elemento de una posición dada, devuelve ese elemento y desplaza todos los elementos posteriores a la izquierda.
La eliminación por índice cambia [a, b, c] a [a, c] cuando remove(1) borra el elemento central.
Eliminación por valor
La eliminación por valor borra el primer elemento igual y devuelve si realmente se eliminó un elemento coincidente.
La eliminación por valor deja un duplicado en [a, b, a] después de que remove("a") elimina la primera a.
Empaquetado automático
El empaquetado automático es la conversión automática que hace Java de un valor primitivo en un objeto de su clase envoltorio correspondiente.
El empaquetado automático permite numbers.add(8) aunque el tipo de elemento de la lista sea Integer, no int.
Encadenamiento de métodos
El encadenamiento de métodos llama a otro método directamente sobre el resultado devuelto por una llamada anterior, como cuando append devuelve el mismo constructor.
El encadenamiento de métodos permite sb.append("x").append(2), pero no puede continuar desde setCharAt, que devuelve void.
Excepción ArrayIndexOutOfBoundsException
Una ArrayIndexOutOfBoundsException informa de un intento de leer o escribir una posición de arreglo fuera de su rango de índices válidos.
Una ArrayIndexOutOfBoundsException ocurre cuando el código lee el índice 4 de un arreglo de cuatro elementos.
Excepción ConcurrentModificationException
Una ConcurrentModificationException puede indicar que una colección cambió de una manera que su iterador activo no estaba preparado para seguir.
Una ConcurrentModificationException puede ocurrir en un solo hilo cuando el cuerpo de un for-each elimina un elemento de su lista de origen.
Excepción NumberFormatException
Una NumberFormatException indica que el texto no se puede convertir al tipo numérico mediante el método de análisis solicitado.
Una NumberFormatException resulta de Integer.parseInt(" 18") porque no se acepta el espacio inicial.
Expresión regular
Una expresión regular es un patrón de texto cuyos símbolos pueden describir coincidencias más allá de los caracteres literales exactos, como en los separadores de split de String.
Una expresión regular que contiene un punto sin escape coincide con caracteres en lugar de dividir solo por puntos literales.
Extremo final excluido
Un extremo final excluido marca la primera posición que queda fuera de un rango, por lo que el número de posiciones incluidas es igual al final menos el inicio.
El extremo final excluido 5 en substring(2, 5) incluye las posiciones 2, 3 y 4, pero deja fuera la posición 5.

F

Filtro
Un filtro selecciona elementos que cumplen una condición y puede recopilarlos en una lista nueva sin modificar la colección original.
Un filtro conserva las palabras de longitud al menos cinco añadiendo las que cumplen la condición a una lista de resultados independiente.

Í

Índice
Un índice es una posición que comienza en cero y que identifica un elemento en una lista, un arreglo o una cadena; la primera posición es 0.
El índice del último elemento de una lista de cuatro elementos es 3, por lo que get(3) lee ese elemento.

I

Igualdad de contenido
La igualdad de contenido comprueba si los contenedores tienen elementos correspondientes iguales en orden, sin exigir que compartan un mismo objeto.
Para arreglos de int, la igualdad de contenido se comprueba con Arrays.equals(a, b), no con equals del arreglo.
Inicializador de arreglo
Un inicializador de arreglo proporciona valores de elementos cuando se crea un arreglo; la cantidad de valores determina la longitud del arreglo.
El inicializador de arreglo de int[] a = {3, 6, 9}; crea tres posiciones que contienen esos valores.
Inmutabilidad
La inmutabilidad significa que el estado almacenado de un objeto no puede cambiar después de crearse, por lo que las transformaciones de String devuelven resultados sin modificarlo.
La inmutabilidad de String deja un alias anterior sin cambios cuando otra variable conserva el resultado de toUpperCase().
Iterador
Un iterador sigue el recorrido de una colección, proporciona el siguiente valor y permite eliminar mediante su propio método.
Un Iterator puede eliminar el número par recién leído con it.remove() mientras continúa por la lista.

L

Límite de bucle
Un límite de bucle es un límite en la condición de un bucle que determina qué posiciones o iteraciones puede procesar el cuerpo.
Un límite de bucle de i < a.length - 1 deja espacio para leer el elemento vecino de la derecha en a[i + 1].
Lista no modificable
Una lista no modificable rechaza los cambios en sus elementos y su estructura, incluidos la adición, la eliminación y la sustitución.
La lista no modificable devuelta por List.of("east", "west") rechaza una llamada posterior a set.

M

Máximo
Un máximo es el valor más grande de un conjunto de datos no vacío; un bucle puede conservar el mejor valor hasta el momento o el índice donde aparece.
El máximo de {-7, -2, -5} es -2, que no se obtendría si el mejor valor se inicializara en cero.
Método compareTo
El método compareTo devuelve un valor negativo, cero o positivo según cómo se ordene el objeto receptor con respecto a su argumento.
compareTo de String utiliza valores char de UTF-16, por lo que un resultado menor que cero significa que el objeto receptor va primero.
Método sobrecargado
Un método sobrecargado es uno de varios métodos con el mismo nombre pero con distintos tipos o cantidades de parámetros.
El método sobrecargado de eliminación seleccionado por un argumento int trata ese argumento como un índice.
Modificación estructural
Una modificación estructural cambia el tamaño o la estructura subyacente de un ArrayList, por ejemplo al añadir o eliminar un elemento durante el recorrido.
Una modificación estructural a través de la lista de origen puede invalidar el estado de su iterador for-each.
Modificación in situ
Una modificación in situ cambia el estado de un objeto existente, por lo que las referencias que ya apuntan a ese objeto observan el contenido modificado.
Una modificación in situ con reverse() cambia el constructor original, por lo que los alias también ven el texto invertido.

O

Orden lexicográfico
El orden lexicográfico compara secuencias en su primera posición diferente y coloca una cadena más corta antes de otra más larga cuando comparten el mismo prefijo.
El orden lexicográfico de Java coloca «12» antes que «8» porque el primer char diferente es '1' frente a '8'.

P

Palíndromo
Un palíndromo se lee igual hacia delante y hacia atrás según la regla de comparación elegida, por ejemplo ignorando mayúsculas, minúsculas y caracteres que no sean letras.
Una comprobación de palíndromo puede normalizar las letras, invertir un constructor nuevo y comparar las Strings resultantes.
Paso por valor
El paso por valor significa que un parámetro de método recibe una copia del valor de un argumento, incluida una referencia copiada para un objeto.
El paso por valor permite que un parámetro de lista modifique elementos compartidos, pero mantiene local la reasignación del parámetro.
Predicado de búsqueda
Un predicado de búsqueda es una comprobación verdadera o falsa que determina si un elemento cumple una condición de búsqueda, como tener un prefijo requerido.
El predicado de búsqueda city.startsWith("M") encuentra nombres mediante una condición en lugar de un único valor exacto.

R

Recorrido
Un recorrido es una visita sistemática a los elementos de una colección, como avanzar del primero al último con un bucle.
Un recorrido en orden inverso comienza en el último índice y llega al índice 0 antes de que termine el bucle.
Recuento condicional
Un recuento condicional registra cuántos elementos cumplen una condición sumando uno a un contador solo cuando la comprobación se cumple.
Un recuento condicional puede registrar cuántas temperaturas diarias superan los 30 grados Celsius.
Referencia
Una referencia es un valor que identifica un objeto y permite que una variable acceda a él en lugar de contener directamente su contenido.
Una referencia copiada permite que dos variables añadan elementos al mismo objeto ArrayList en memoria.
Resultado de búsqueda
Un resultado de búsqueda indica si se encontraron datos coincidentes o dónde se encontraron; las búsquedas de índice en listas utilizan -1 para indicar que no hay coincidencia.
El resultado de búsqueda de names.indexOf("Kai") puede ser 0, por lo que una comprobación de coincidencia debe aceptar ese índice.
Retorno anticipado
Un retorno anticipado termina un método en cuanto se conoce su resultado, por ejemplo cuando una búsqueda de la primera coincidencia llega a un elemento coincidente.
Un retorno anticipado desde el if de coincidencia evita comprobar nombres después de la primera coincidencia encontrada.

S

Subcadena
Una subcadena es una parte contigua de una String, seleccionada mediante un índice inicial y, opcionalmente, un índice final que se excluye.
La subcadena desde los índices 1 a 3 de "planet" se selecciona con substring(1, 4) y es «lan».
Sustitución literal
Una sustitución literal sustituye texto o caracteres que coinciden exactamente sin interpretar el objetivo como un patrón de expresión regular.
Una sustitución literal con replace(".", "-") cambia los puntos de «a.b.c» por guiones.

U

Unidad de código UTF-16
Una unidad de código UTF-16 es la unidad almacenada por un char de Java; un símbolo mostrado puede necesitar una unidad o un par de ellas.
Un emoji puede ocupar dos unidades de código UTF-16, lo que afecta al recuento devuelto por length() de String.
Unión de cadenas
Una operación de unión de cadenas combina partes de texto en una String con un separador elegido colocado entre las partes, pero no después de la última.
Una unión con String.join("/", pieces) convierte las partes «a», «b» y «c» en el texto «a/b/c».

V

Valor centinela
Un valor centinela es un resultado elegido especialmente para indicar una condición como la ausencia de coincidencias, distinto de los resultados correctos habituales.
El valor centinela -1 indica que una búsqueda por índice no encontró coincidencias porque ningún índice válido puede ser negativo.
Valor no numérico (NaN)
NaN significa «valor no numérico» y es un resultado en coma flotante de operaciones como dividir un total cero entre un recuento cero.
Una media de datos vacíos calculada como 0.0 / 0 produce NaN en lugar de una medida útil.
Valor null
Null es el valor de referencia que no identifica ningún objeto, por lo que no se puede llamar a un método de instancia mediante esa referencia.
Un resultado null debe comprobarse antes de que el código llame a length() sobre una String que una búsqueda podría devolver.
Valor predeterminado
Un valor predeterminado es el valor inicial que Java asigna a una posición de arreglo recién creada, como cero, false o null según su tipo.
El valor predeterminado de cada posición de un arreglo de String nuevo es null, por lo que todavía no se pueden ejecutar métodos de String sobre ellas.
Variable temporal
Una variable temporal conserva un valor intermedio mientras otras asignaciones modifican las posiciones de las que se leyó ese valor.
Una variable temporal guarda el primer elemento durante un intercambio para que la siguiente asignación no lo pierda.

Sobre esta unidad

Por StudeliInformar de un error

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.

Comenzar