Java
Arrays y ArrayList
Arrays de tamaño fijo, la clase ArrayList que crece sola, y cuándo usar cada uno.
El problema: varias notas, no una sola
El método promedio de la página anterior recibe dos notas fijas. ¿Y si un curso tiene 30 alumnos, o un número de notas que no se sabe de antemano? Hace falta una forma de guardar varios valores bajo un solo nombre. Java ofrece dos: el array, de tamaño fijo, y ArrayList, que crece y achica sola.
Arrays: tamaño fijo
Array es una palabra en inglés que se traduce como “arreglo” o “formación” (la misma palabra que se usa para una formación militar en filas) — en Java se usa directamente en inglés, sin traducir, y así se le dice también hablando en español. La idea es esa: varias casillas ordenadas, una al lado de la otra, todas del mismo tipo. Un array se declara con el tipo seguido de [], y su tamaño queda fijado en el momento en que se crea:
public class Main {
public static void main(String[] args) {
int[] notas = new int[3];
notas[0] = 8;
notas[1] = 6;
notas[2] = 9;
System.out.println(notas[1]);
System.out.println(notas.length);
}
}6
3new int[3]reserva espacio para exactamente 3 enteros. Ese número no puede cambiar después: no existe un array que “agregue un lugar más” — hay que crear uno nuevo.- Se accede a cada posición con
[índice], y los índices arrancan en 0:notas[0]es el primer elemento,notas[2]el último de un array de 3. .length(literalmente “largo” o “longitud”, sin paréntesis porque es un atributo, no un método) da el tamaño del array.
Acceder a un índice que no existe (notas[3] en un array de tamaño 3) no da un valor raro ni silencioso: lanza una excepción, ArrayIndexOutOfBoundsException, y el programa termina si nadie la maneja. Es un error muy común al recorrer un array con <= en vez de < en la condición del for.
También se puede crear un array con valores ya cargados, sin pasar por new:
int[] notas = {8, 6, 9};Recorrer un array
int[] notas = {8, 6, 9};
for (int i = 0; i < notas.length; i++) {
System.out.println(notas[i]);
}Cuando no hace falta el índice, un for-each es más corto y evita el riesgo de equivocarse con < vs <=:
for (int nota : notas) {
System.out.println(nota);
}for (int nota : notas) se lee “para cada nota en notas” — en cada vuelta, nota toma el valor de la siguiente posición del array, sin necesidad de manejar un índice a mano.
ArrayList: tamaño dinámico
ArrayList es una clase de la biblioteca estándar que se comporta como un array, pero puede crecer y achicarse mientras el programa corre:
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<Integer> notas = new ArrayList<>();
notas.add(8);
notas.add(6);
notas.add(9);
System.out.println(notas.get(1));
System.out.println(notas.size());
}
}6
3Algunas diferencias frente al array:
| Array | ArrayList | |
|---|---|---|
| Tamaño | Fijo desde que se crea | Crece y achica con .add() / .remove() |
| Acceder a un elemento | notas[1] | notas.get(1) |
| Tamaño actual | notas.length | notas.size() |
| Import | No hace falta | import java.util.ArrayList; |
| Tipo de los elementos | Cualquiera, incluidos primitivos (int[]) | Solo clases — de ahí Integer, no int |
ArrayList<Integer> usa Integer, la clase envoltorio de int que se mencionó en la página de variables, y no int directamente. ArrayList (y el resto de las colecciones de Java) solo puede guardar objetos, nunca primitivos — por eso hace falta la envoltorio aquí. Al escribir notas.add(8), Java convierte automáticamente ese 8 (un int) a un Integer (autoboxing), así que en la práctica no hace falta pensar en esto todo el tiempo.
ArrayList también se recorre con for-each, igual que un array:
for (int nota : notas) {
System.out.println(nota);
}¿Cuál usar?
Como regla práctica: si sabes el tamaño exacto de antemano y no va a cambiar, un array alcanza y es más liviano. Si el tamaño depende de datos que llegan en tiempo de ejecución — el usuario agrega elementos, se cargan desde un archivo, etc. — ArrayList evita tener que calcular ese tamaño por adelantado.
Pon a prueba
¿Qué imprime este programa?
int[] numeros = {10, 20, 30, 40};
int suma = 0;
for (int n : numeros) {
suma = suma + n;
}
System.out.println(suma);
System.out.println(numeros[numeros.length - 1]);Imprime 100 y después 40. El for-each recorre los cuatro elementos y los va acumulando en suma (10+20+30+40 = 100). numeros.length - 1 es 3, el índice del último elemento de un array de 4 posiciones (0, 1, 2, 3) — por eso numeros[numeros.length - 1] es una forma común de acceder al último elemento sin escribir el tamaño a mano.
Ordena las líneas para cargar tres nombres en un ArrayList e imprimirlos con un for-each.
- nombres.add("Ana");
- import java.util.ArrayList;
- }
- nombres.add("Caro");
- public static void main(String[] args) {
- }
- nombres.add("Beto");
- for (String nombre : nombres) {
- ArrayList<String> nombres = new ArrayList<>();
- }
- public class Main {
- System.out.println(nombre);
Siguiente paso
Guardar notas en un array o una lista está bien, pero un curso real tiene más datos por alumno que solo una nota: nombre, edad, historial. Para agrupar todo eso bajo un mismo objeto, sigue con Clases y objetos.