2. 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”
5. 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
7. 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
9. 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
18. 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()
19. 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
21. 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
23. 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
25. 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)
27. 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”
28. 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(...))
30. 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(...))
35. 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]
39. 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(...))
40. 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
44. 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í
45. 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
48. 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)
52. 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