Curso básico de Java - #15 - Clases fundamentales: ArrayList

Buenas foro,
En el tema de hoy nos daremos una pequeña pausa con las bases de la POO y veremos una clase muy importante: ArrayList.


Sobre ArrayList

  • Como su nombre indica, ArrayList nos brinda unas opciones o características similares a los arrays los cuales vimos en el tema #4. Pero, con la diferencia que mientras un array es estático (tiene un numero de posiciones fijas), las listas de ArrayList son dinámicas (se pueden añadir y eliminar elementos sobre la marcha).

  • Entonces, ¿porque hay veces que se usan arrays en vez de la clase ArrayList?
    Bueno, la respuesta resumida es la optimización; recorrer o interactuar con un array es mas rápido y eficiente que con un objeto de la clase ArrayList. Aunque ahora a nosotros no nos importa mucho, pero, esta bien tenerlo en cuenta.

  • ArrayList solo admite objetos como elementos de la lista, ademas estos deben ser de la misma clase. Entonces, ¿Como hacemos si queremos guardar por ejemplo un numero (que seria del tipo byte, short, int o long, todos tipos primitivos)? Pues usariamos la clase Integer la cual emula (y añade funcionalidades) al tipo primitivo int.

  • Al igual que con los arrays, las posiciones empiezan por 0.


Paquete
La clase ArrayList depende del paquete java.util por lo que si vamos a usarlo en alguna clase, debemos importar el paquete entero (import java.util.*;) o la clase en especifico (import java.util.ArrayList;).


Instanciar listas

Sintaxis
new ArrayList<[clase]>()

Eso devuelve un objeto de la clase ArrayList<[clase]>, pero deberíamos hacer algo con el, por ejemplo guardarlo en una variable:

ArrayList<[clase]> [nombreVariable] = new ArrayList<[clase]>();
Ejemplo
ArrayList<String> cadenas = new ArrayList<String>();

Métodos de ArrayList
Tiene muchos, nosotros vamos a ver los mas básicos / interesantes. Si alguien se queda con las ganas aquí tiene mas: ArrayList (Java SE 21 & JDK 21).

Algunos métodos
Método Utilidad Parámetros Devuelve Ejemplo
.add([elemento]) Añade un elemento al final de la lista. Objeto. Nada. miLista.add("Hola Mundo");
.add([index], [elemento]) Inserta un elemento en una posición específica. Índice (int), Objeto. Nada. miLista.add(1, "Adiós Mundo");
.get([index]) Devuelve el elemento especificado. Índice del elemento (int). Objeto. miLista.get(0); // Devuelve "Hola Mundo"
.set([index], [elemento]) Reemplaza el elemento en una posición específica. Índice (int), nuevo objeto. Objeto anterior. miLista.set(0, "Nuevo valor");
.remove([index]) Elimina el elemento en la posición dada. Índice (int). Objeto eliminado. miLista.remove(0);
.remove([elemento]) Elimina la primera ocurrencia del objeto, la segunda pasa a ser la primera. Objeto. true si se eliminó, false si no estaba. miLista.remove("Hola Mundo");
.size() Devuelve la cantidad de elementos. Ninguno. Número entero (int). miLista.size(); // 3
.isEmpty() Verifica si está vacía. Ninguno. Valor booleano. miLista.isEmpty(); // Devuelve false.
.clear() Elimina todos los elementos. Ninguno. Nada. miLista.clear();
.contains(elemento) Verifica si existe un elemento. Objeto. Valor booleano. miLista.contains("Yo soy Sugoli15"); // Devuelve false.
.indexOf(elemento) Devuelve el índice de la primera ocurrencia. Objeto. Índice (int) o -1 si no existe. miLista.indexOf("Hola");
.lastIndexOf(elemento) Índice de la última ocurrencia. Objeto Índice (int) o -1. miLista.lastIndexOf("Hola");

Ejemplo recorrer una lista

RercorerArrayList.java
import java.util.ArrayList;

public class RercorerArrayList
{
	public static void main(String[] args)
	{
		// Declarar e inicializar variable con objeto de ArrayList<Integer>.
		ArrayList<Integer> numeros = new ArrayList<Integer>();

		// Rellenar la lista números.
		numeros.add(10);
		numeros.add(20);
		numeros.add(30);
		numeros.add(40);
		numeros.add(50); 

		// Recorrer lista e imprimir elementos.
		for(int i = 0; i < numeros.size(); i++)
		{
		    System.out.print(numeros.get(i) + ", ");
		}
	}
}

También se podría usar for-each.

Output
10, 20, 30, 40, 50, 

Matrices con ArrayList
Bueno, es posible, pero es bastante mas engorroso que con los arrays.
Ya que un ArrayList puede ser de cualquier clase, tambien puede contener otro ArrayList:

Sintaxis
new ArrayList<ArrayList<[clase]>>();

Por ejemplo:

ArrayList<ArrayList<Boolean>> miLista = new ArrayList<ArrayList<Boolean>>();
Interaccion con la matriz

Para acceder a una linea de la matriz:

miLista.get(y)

Y para acceder a un elemento de la matriz:

miLista.get(y).get(x)

Para otro tipo de interacciones parecido.


Para quien quiera mas información, pueden visitar la ya mencionada API oficial de Oracle: ArrayList (Java SE 21 & JDK 21).


Otros tipos de listas
Existen mas tipos listas dinámicas, cada una con su enfoque y con un funcionamiento ligeramente distinto. No me voy a parar a explicar mas clases que heredan de List pues podría hacer un curso solo sobre ello, pero, si a alguien le interesa dejo aquí un pequeño articulo que habla muy resumidamente sobre los fundamentos FIFO y LIFO aplicados en Java: Dominando las Estructuras de Datos en Java: Pilas y Colas | by Amador Quispe H. | Medium.


En el siguiente tema veremos la clase String; el manejo de cadenas (ya sabéis, el típico ejercicio de encontrar una letra o dar la vuelta a la cadena) y algún otro concepto relacionado con los objetos en Java.

2 Me gusta