ArrayList¶
La clase ArrayList
pertenece a la biblioteca de Java, está incluida en el paquete java.util
. Esta clase permite trabajar con arrays redimensionables cuyo número de elementos puede crecer o decrecer en tiempo de ejecución según las necesidades del programa. ArrayList
contiene internamente una matriz de valores y una variable de contador para conocer el tamaño actual en cualquier punto. Si se agrega un elemento, se aumenta el tamaño, y si se elimina, se
reduce.
De forma general un ArrayList en Java se puede crear de cualquiera de las siguientes formas:
List nombreArrayList = new ArrayList();
ArrayList nombreArrayList = new ArrayList();
Esta instrucción crea el ArrayList
nombreArrayList vacío. Un ArrayList
declarado así puede contener objetos de cualquier tipo. Por ejemplo:
ArrayList a = new ArrayList();
a.add("Lenguaje");
a.add(3);
a.add('a');
a.add(23.5);
Los elementos del ArrayList a son: “Lenguaje”, 3, ‘a’, 23.5
. Es decir, un ArrayList puede contener objetos de tipos distintos. En este ejemplo, el primer objeto que se añade es el String “Lenguaje”. El resto no son objetos. Son datos de tipos primitivos pero el compilador los convierte automáticamente en objetos de su clase envolvente (clase contenedora o Wrapper
) antes de añadirlos al ArrayList
.
Un array al que se le pueden asignar elementos de distinto tipo puede tener alguna complicación a la hora de trabajar con él. Por eso, una alternativa a esta declaración es indicar el tipo de objetos que contiene. En este caso, el array redimensionable solo podrá contener objetos de ese tipo. De forma general:
List<tipo> nombreArrayList = new ArrayList();
ArrayList<tipo> nombreArrayList = new ArrayList();
ArrayList <tipo> nombreArrayList = new ArrayList<>();
A esta forma de definir una clase class ArrayList<tipo>
se le conoce como definición con tipo parametrizado o genérico. Donde, tipo presenta cualquier tipo de clase de objetos en Java. Los tipos genéricos no se limitan solamente a colecciones, también podemos definir clases o tipos genéricos propios. tipo debe ser una clase. Indica el tipo de objetos que contendrá el array y no se pueden usar tipos primitivos. Para un tipo primitivo se debe utilizar su clase envolvente. Por ejemplo:
ArrayList <Integer> numeros = new ArrayList<>();
//Crea el array redimensionable llamado números compuesto por enteros.
Hay una gran cantidad de métodos que proporciona ArrayList
implementados de la interface List
, es recomendable acudir a la documentación oficial
Recorriendo ArrayList
Podemos recorrerlo de forma clásica con un bucle for:
for (int i = 0; i < array.size(); i++){
System.out.println(array.get(i));
}
for (Integer i: numeros){
System.out.println(i);
}
for (Object o: nombreArray){
System.out.println(o);
}
//Eliminar elementos del ArrayList con valor menor de 10. (No se puede realizar con foreach).
import java.util.List;
import java.util.ArrayList;
public class AL1 {
public static void main(String[] args) {
List<Integer> numeros = new ArrayList<>();
numeros.add(12);
numeros.add(8);
numeros.add(2);
numeros.add(23);
for (int i = 0; i < numeros.size(); i++){
if (numeros.get(i) < 10) {
numeros.remove(i);
/* Al borrar un elemento del ArrayList se desplazan el resto
de elementos una posición a la izquierda. */
i--; }
}
System.out.println(numeros);
}
}
//Uso de los métodos add, remove, set, get.
import java.util.ArrayList;
public class AL2 {
public static void main(String[] args) {
ArrayList<String> nombres = new ArrayList<>();
nombres.add("Ana");
nombres.add("Luisa");
nombres.add("Felipe");
System.out.println(nombres); // [Ana, Luisa, Felipe]
nombres.add(1, "Pablo");
System.out.println(nombres); // [Ana, Pablo, Luisa, Felipe]
nombres.remove(0);
System.out.println(nombres); // [Pablo, Luisa, Felipe]
nombres.set(0,"Alfonso");
System.out.println(nombres); // [Alfonso, Luisa, Felipe]
String s = nombres.get(1);
String ultimo = nombres.get(nombres.size() - 1);
System.out.println(s + " " + ultimo); // Luisa Felipe
}
}
Copia de ArrayList
El nombre de un ArrayList contiene la referencia al ArrayList, es decir, la dirección de memoria donde el ArrayList se encuentra, igual que sucede con los arrays estáticos. Si disponemos de un ArrayList de enteros llamado ventas:
ArrayList<Integer> ventas1 = ventas;
No copia el ArrayList ventas en el nuevo ArrayList ventas1
sino que crea un alias. De esta forma tenemos dos maneras de acceder al mismo ArrayList, mediante la referencia ventas y mediante la referencia ventas1.
La copia del ArrayList se puede realizar de forma manual elemento a elemento o se puede pasar la referencia del ArrayList original al constructor del nuevo:
ArrayList<Integer> ventas1 = new ArrayList<>(ventas);
LinkedList¶
La clase LinkedList
pertenece también a la biblioteca de Java se encuentra en el paquete java.util
. Esta clase maneja listas doblemente enlazadas y es apropiado para el diseño de colas y pilas.
De forma general un ArrayList en Java se puede crear de la siguiente forma:
List nombreLinkedList = new LinkedList(); //downcasting desde interface
LinkedList nombreLinkedList = new LinkedList();
Esta instrucción crea el LinkedList
nombreLinkedList vacío. Un LinkedList
declarado así puede contener objetos de cualquier tipo:
List<tipo> nombreLinkedList = new LinkedList<tipo> (); //downcasting
LinkedList<tipo> nombreLinkedList = new LinkedList<tipo> ();
Donde tipo
debe ser una clase que indica el tipo de objetos que contendrá la lista doblemente enlazada. Debe importarse el paquete java.util.LinkedList;
.
Al igual que ocurría con ArrayList
, no se pueden usar tipos primitivos, para usar un tipo primitivo se debe utilizar su clase envolvente. Además, se puede hacer uso del operador diamond(<>
).
Hay una gran cantidad de métodos que proporciona LinkedList
, es recomendable acudir a la documentación oficial.
Actividades¶
-
AC 901 (RA6 / CE6a CE6b CE6c CE6e CE6f CE6g / IC1 / 3p). Crea un programa Java que utilice un
ArrayList
de objetos de la claseCoche
. El programa pide por teclado los datos privados de cada uno de los coches y los guarda en un array redimensionable de la claseArrayList
. A continuación, debe mostrar por pantalla lo siguiente:- a) Todos los coches introducidos.
- b) Todos los coches de una marca determinada.
- c) Todos los coches con menos de un número determinado de Kilómetros.
- d) El coche con mayor número de Kilómetros.
- e) Todos los coches ordenados por número de kilómetros de menor a mayor.
La clase Coche tiene que estar correctamente definida por ti. Al main ha se ser funcional y permitir al usuario introducir tantos coches como desee. Se deben controlar que todas las excepciones que consideres.
-
AC 902 (RA6 / CE6a CE6b CE6c CE6e CE6f CE6g / IC1 / 3p). Crea un programa que trabaje sobre el listado de empleados de una empresa utilizando un array redimensionable con la clase ArrayList. Para ello, en el mismo archivo .java:
- a) Genera una clase Principal con el método main.
- b) Genera una clase Empleado con un atributo privado llamado apellido.
- c) El programa debe mostrar siempre el nº de empleados existente.
-
d) Y además permitirá realizar las siguientes acciones:
- Insertar empleado.
- Borrar empleado.
- Recorrer la lista.
- Buscar empleado.
- Borrar todos los empleados.
- Finalizar programa.
Al main ha se ser funcional y permitir al usuario introducir los empleados como desee. Se deben controlar que todas las excepciones que consideres.
-
AC 903 (RA6 / CE6a CE6b CE6c CE6e CE6f CE6g / IC1 / 3p). Implementar una aplicación para gestionar las existencias de una tienda de repuestos de automóviles. Cada producto se identifica por un código alfanumérico. La aplicación permitirá dar de alta o de baja productos y actualizar el número de unidades en stock de cada uno de ellos.
Debes diseñar la clase repuesto. El usuario puede crear tantos repuestos como considere. Se han de controlar las excepciones que consideres.