Java Collection Framework: lo que todo Java Dev debe conocer

abadongutierrez 216 views 55 slides Jul 29, 2023
Slide 1
Slide 1 of 55
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37
Slide 38
38
Slide 39
39
Slide 40
40
Slide 41
41
Slide 42
42
Slide 43
43
Slide 44
44
Slide 45
45
Slide 46
46
Slide 47
47
Slide 48
48
Slide 49
49
Slide 50
50
Slide 51
51
Slide 52
52
Slide 53
53
Slide 54
54
Slide 55
55

About This Presentation

Slides usados en el meetup de Java Mexico el 26 de Julio de 2023.


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 ”

Java Collection Framework - Interfaces* *Vista simplificada

java.util.Collection

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

Y hay mas!

Java Collection Framework - Interfaces

Gracias!