Java Collection Framework: lo que todo Java Dev debe conocer
abadongutierrez
216 views
55 slides
Jul 29, 2023
Slide 1 of 55
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
About This Presentation
Slides usados en el meetup de Java Mexico el 26 de Julio de 2023.
Size: 3.82 MB
Language: es
Added: Jul 29, 2023
Slides: 55 pages
Slide Content
Java Collection Framework lo que todo Java Dev debe conocer Rafael Gutiérrez, @abaddon_gtz JVM_MX, Julio 2023
Java Collection Framework Antes solo había Vector y Stack Agregado a Java en la versión 1.2 (en 1998) “Una arquitectura unificada para representar y manipular colecciones, permitiendo manipular las colecciones independientemente de los detalles de implementación ”
Collection La raíz de la jerarquía de colecciones Representa un grupo de objetos (elementos) Debe ser usada cuando se desee pasar colecciones de objetos a otros objetos y se busque “la máxima generalidad” Por convención las implementaciones de colecciones tienen un constructor que recibe Collection
Recorrer una colección
Otras operaciones de Collection size(), isEmpty() contains(obj), containsAll(otherCollection) add(item), addAll(otherCollection) remove(item), removeAll(otherCollection) removeIf(somePredicate) retainAll(otherCollection) clear() stream(), parallelStream() // pero por supuesto! Y esto es tema aparte! Y mas :D
java.util.List
List Colección que mantiene el orden de inserción [ordered] ( también conocida como Secuencia) Control preciso de dónde insertar un elemento en la lista Se puede acceder a sus elementos por índice Permite duplicados Permite nulls
Crear una lista
Recorrer una lista - for por índice También puedes usar for-each e Iterator! (mas facil)
Recorrer una lista - ListIterator
Buscar el índice de un elemento
Ordenar [sorting] una lista de enteros
Ordenar [sorting] una lista de objetos
Ordenar [sorting] una lista de objetos “comparables”
Ordenar [sorting] una lista de objetos con Comparator
List desde Java 21 SequencedCollection Una colección con un orden de aparición [encounter-order] bien definido addFirst(item), addLast(item) getFirst(), getLast() removeFirst(), removeLast() reversed()
ArrayList Implementación de List con arreglos que se ajustan de tamaño [resizable-array] Tiene una capacidad que aumenta automáticamente al llenarse el arreglo Se puede especificar la capacidad via el constructor No es sincronizada (no es Thread Safe ) Collections.synchronizedList(new ArrayList(...)) Iteradores creados usando iterator() o listIterator() son “fail-fast”. Es decir, si la lista es modificada después de crear el iterador un error ConcurrentModificationException es lanzado
Crear un ArrayList simple emojis = [😀, 😁, 😂]
CopyOnWriteArrayList Variante Thread-safe de ArrayList Todos los métodos que “modifican” la lista están implementados para crear una copia nueva del arreglo interno Los Iterator creados con iterator() o listIterator() crean una “foto” [snapshot] del arreglo interno y así se evita el error ConcurrentModificationException Es costoso en recursos, usalo con cuidado y bajo tu propio riesgo
Iterator snapshot con CopyOnWriteArrayList
LinkedList Implementación de List usando una lista doblemente ligada No es sincronizada (no es Thread-safe) Collections.synchronizedList(new LinkedList(...)) Similar a ArrayList los Iterator creador por iterator() or listIterator() son “fail-fast” No es recomendable su uso ArrayDeque es mejor opción
java.util.Set
Set Colección que no permite duplicados Solo un elemento null Algunas implementaciones no permiten null No existe un par de elementos e1 y e2 donde e1.equals(e2)
Crear un Set numbers = [4, 3, 2, 1, 5]
HashSet Implementación de Set donde internamente se tiene un hash table (instancia de HashMap) No hace garantías en cuanto al orden de iteración Permite un elemento null Rendimiento constante en tiempo para operaciones básicas como add, remove, contains y size Asumiendo the la función hash dispersa uniformemente los elementos No es sincronizada (no es Thread-safe) Collections.synchronizedSet(new HashSet(...)) Iteradores creados por esta clase son “fail-fast”
TreeSet Implementación de Set donde los elementos son ordenados [sorted] por su orden natural o usando un Comparator log(n) garantizado para operaciones como add, remove y contains Almacena sus elementos internamente un árbol “red-black” Implementaciones de Comparable y Comparator usados para el ordenamiento deben ser “consistentes con equals” No es sincronizada (no es Thread-safe) Collections.synchronizedSet(new TreeSet(...))
Algunos metodos de TreeSet
LinkedHashSet Implementación de Set donde internamente se tiene un Hash Table y una lista ligada Tiene un orden de aparición bien definido de sus elementos Provee rendimiento constante para las operaciones add, contains and remove De forma similar a HashSet asumiendo que la función hash dispersa uniformemente los elementos Iterar los elementos tiene mejor rendimiento que en un HashSet No es sincronizada (no es Thread-safe) Collections.synchronizedSet(new LinkedHashSet(...))
CopyOnWriteArraySet Implementacion de Set que usa internamente CopyOnWriteArrayList Comparte las mismas propiedades de un CopyOnWriteArrayList
Set desde Java 21 SequencedSet Un Set con un orden de aparición [encounter-order] bien definido reversed
Porque SequencedCollections? https://openjdk.org/jeps/431 Motivation Java’s collections framework lacks a collection type that represents a sequence of elements with a defined encounter order. It also lacks a uniform set of operations that apply across such collections. These gaps have been a repeated source of problems and complaints.
java.util.Map
Map Diccionario de datos Mapea Llaves [Keys] a valores [values] No permite llaves duplicadas y cada llave mapea por lo menos a un valor Provee tres vistas de colecciones: un Set llaves, una Collection de valores y un Set de mapeos llave-valor [Entries]
Crear un Map
Algunos metodos para agregar elementos a un Map
Metodo compute
HashMap Implementación de Map usando Hash Tables Permite llaves y valores null No hay garantías en cuanto al orden de aparición Provee rendimiento constante para operaciones get y put De nuevo, asumiendo que la función hash dispersa uniformemente las llaves No es sincronizada (no es Thread-safe) Collections.synchronizedMap(new HashMap(...))
TreeMap Implementación de Map donde las llaves están ordenadas por su orden natural o por el Comparator especificado en el constructor El comportamiento y rendimiento es análogo a un TreeSet
Algunos metodos de TreeMap
LinkedHashMap Implementación de Map usando Hash Tables y una lista ligada. El comportamiento y rendimiento es análogo a un LinkedHashSet
java.util.Queue
Queue (kyu) Una colección diseñada para almacenar elementos antes de ser “procesados” Tiene las mismas operaciones que Collection pero provee adicionales para insertar, extraer, inspeccionar. Estas operaciones pueden tirar una excepción o regresar un valor especial (null o false) Tipicamente son FIFO (first-in-first-out) PriorityQueue no funciona así
PriorityQueue Queue con prioridad ilimitada [unbounded] basado en un Priority Heap Los elementos son ordenados de acuerdo a su orden natural o por el Comparator especificado en el constructor No permite nulls La cabeza del Queue [head] es el elemento menor según su ordenamiento No sincronizada (no Thread-safe) PriorityBlockingQueue
PriorityQueue ejemplo
java.util.Deque
Deque (deck) Colección que soporta insertar y remover elementos al principio y al final Deque es “double ended queue” Similar a Queue sus métodos pueden tirar excepción o regresar un valor especial (null o false) Puede ser usados para comportamientos FIFO (first-in-first-out) o LIFO (last-in-first-out)
Metodos de Deque
Deque como Queue (LIFO)
Deque como Stack (LIFO)
ArrayDeque Implementación de Deque basada en un arreglo que se ajusta de tamaño [resizable-array] No Thread-safe Iterators creados de ArrayDeque son fail-fast No nulls Mejor desempeño que la clase Stack cuando se usa como una stack Mejor desempeño que LinkedList cuando se usa como queue