1. Información general
En este artículo, vamos a echar un vistazo a la clase ArrayList de Java Collections Framework. Discutiremos sus propiedades, casos de uso comunes, así como sus ventajas y desventajas.
ArrayList reside dentro de las bibliotecas principales de Java, por lo que no necesita bibliotecas adicionales. Para usarlo, simplemente agregue la siguiente declaración de importación:
import java.util.ArrayList;
La lista representa una secuencia ordenada de valores donde algún valor puede aparecer más de una vez.
ArrayList es una de las implementaciones de List creadas sobre una matriz, que puede crecer y reducirse dinámicamente a medida que agrega / elimina elementos. Se puede acceder fácilmente a los elementos mediante sus índices a partir de cero. Esta implementación tiene las siguientes propiedades:
- El acceso aleatorio tarda O (1) tiempo
- La suma de elementos toma un tiempo constante amortizado O (1)
- Insertar / Eliminar toma O (n) tiempo
- La búsqueda lleva O (n) tiempo para una matriz sin clasificar y O (log n) para una ordenada
2. Cree una ArrayList
ArrayList tiene varios constructores y los presentaremos todos en esta sección.
En primer lugar, observe que ArrayList es una clase genérica, por lo que puede parametrizarla con cualquier tipo que desee y el compilador se asegurará de que, por ejemplo, no podrá poner valores Integer dentro de una colección de Strings . Además, no es necesario convertir elementos al recuperarlos de una colección.
En segundo lugar, es una buena práctica usar la interfaz genérica List como un tipo de variable, porque la desacopla de una implementación particular.
2.1. Constructor No-Arg predeterminado
List list = new ArrayList(); assertTrue(list.isEmpty());
Simplemente estamos creando una instancia de ArrayList vacía .
2.2. Constructor que acepta la capacidad inicial
List list = new ArrayList(20);
Aquí especifica la longitud inicial de una matriz subyacente. Esto puede ayudarlo a evitar cambios de tamaño innecesarios al agregar nuevos elementos.
2.3. Constructor que acepta la colección
Collection number = IntStream.range(0, 10).boxed().collect(toSet()); List list = new ArrayList(numbers); assertEquals(10, list.size()); assertTrue(numbers.containsAll(list));
Tenga en cuenta que ese elemento de la instancia de Colección se utiliza para completar la matriz subyacente.
3. Agregue elementos a ArrayList
Puede insertar un elemento al final o en la posición específica:
List list = new ArrayList(); list.add(1L); list.add(2L); list.add(1, 3L); assertThat(Arrays.asList(1L, 3L, 2L), equalTo(list));
También puede insertar una colección o varios elementos a la vez:
List list = new ArrayList(Arrays.asList(1L, 2L, 3L)); LongStream.range(4, 10).boxed() .collect(collectingAndThen(toCollection(ArrayList::new), ys -> list.addAll(0, ys))); assertThat(Arrays.asList(4L, 5L, 6L, 7L, 8L, 9L, 1L, 2L, 3L), equalTo(list));
4. Iterar sobre ArrayList
Hay dos tipos de iteradores disponibles: Iterator y ListIterator .
Mientras que el primero le brinda la oportunidad de recorrer la lista en una dirección, el segundo le permite recorrerla en ambas direcciones.
Aquí le mostraremos solo el ListIterator :
List list = new ArrayList( IntStream.range(0, 10).boxed().collect(toCollection(ArrayList::new)) ); ListIterator it = list.listIterator(list.size()); List result = new ArrayList(list.size()); while (it.hasPrevious()) { result.add(it.previous()); } Collections.reverse(list); assertThat(result, equalTo(list));
También puede buscar, agregar o eliminar elementos utilizando iteradores.
5. Busque en ArrayList
Demostraremos cómo funciona la búsqueda usando una colección:
List list = LongStream.range(0, 16) .boxed() .map(Long::toHexString) .collect(toCollection(ArrayList::new)); List stringsToSearch = new ArrayList(list); stringsToSearch.addAll(list);
5.1. Búsqueda de una lista sin clasificar
Para encontrar un elemento, puede usar los métodos indexOf () o lastIndexOf () . Ambos aceptan un objeto y devuelven un valor int :
assertEquals(10, stringsToSearch.indexOf("a")); assertEquals(26, stringsToSearch.lastIndexOf("a"));
Si desea encontrar todos los elementos que satisfacen un predicado, puede filtrar la colección usando Java 8 Stream API (lea más sobre esto aquí) usando Predicate como este:
Set matchingStrings = new HashSet(Arrays.asList("a", "c", "9")); List result = stringsToSearch .stream() .filter(matchingStrings::contains) .collect(toCollection(ArrayList::new)); assertEquals(6, result.size());
También es posible utilizar un bucle for o un iterador:
Iterator it = stringsToSearch.iterator(); Set matchingStrings = new HashSet(Arrays.asList("a", "c", "9")); List result = new ArrayList(); while (it.hasNext()) { String s = it.next(); if (matchingStrings.contains(s)) { result.add(s); } }
5.2. Búsqueda de una lista ordenada
Si tiene una matriz ordenada, puede usar un algoritmo de búsqueda binaria que funcione más rápido que la búsqueda lineal:
List copy = new ArrayList(stringsToSearch); Collections.sort(copy); int index = Collections.binarySearch(copy, "f"); assertThat(index, not(equalTo(-1)));
Tenga en cuenta que si no se encuentra un elemento, se devolverá -1.
6. Remove Elements from the ArrayList
In order to remove an element, you should find its index and only then perform the removal via remove() method. An overloaded version of this method, that accepts an object, searches for it and performs removal of the first occurrence of an equal element:
List list = new ArrayList( IntStream.range(0, 10).boxed().collect(toCollection(ArrayList::new)) ); Collections.reverse(list); list.remove(0); assertThat(list.get(0), equalTo(8)); list.remove(Integer.valueOf(0)); assertFalse(list.contains(0));
But be careful when working with boxed types such as Integer. In order to remove a particular element, you should first box int value or otherwise, an element will be removed by its index.
You may as well use the aforementioned Stream API for removing several items, but we won't show it here. For this purpose we will use an iterator:
Set matchingStrings = HashSet(Arrays.asList("a", "b", "c", "d", "e", "f")); Iterator it = stringsToSearch.iterator(); while (it.hasNext()) { if (matchingStrings.contains(it.next())) { it.remove(); } }
7. Summary
In this quick article, we had a look at the ArrayList in Java.
Mostramos cómo crear una instancia de ArrayList , cómo agregar, buscar o eliminar elementos usando diferentes enfoques.
Como de costumbre, puede encontrar todos los ejemplos de código en GitHub.