Post on 31-Dec-2014
Definiciones Introducción Principales interfaces Ordenamiento Implementaciones concretas
₋ Implementaciones de propósito general₋ Wrappers (decorators)₋ Conveniencias (mini implementaciones útiles)₋ Implementaciones legadas₋ Implementaciones de propósito especial
Algoritmos La interfaz java.util.RandomAccess La clase java.util.Arrays
Colección₋ Una colección — a veces llamada
“contenedor” — es un objeto que agrupa múltiples elementos en una unidad simple
₋ Las colecciones son utilizadas para almacenar, recuperar, manipular y comunicar datos agregados.
₋ Típicamente representan elementos de datos que forman naturalmente un grupo
A partir de Java 2 (1.2+) se incorpora un framework estándar para manejo de colecciones
Previo a Java 2 manejo básico mediante arrays y las clases java.util.Vector y java.util.Hashtable
¿Qué provee el framework?₋ Interfaces₋ Clases concretas₋ Algoritmos
Interfaz raíz de la jerarquía de colecciones
Define la interfaz común para todas las colecciones concretas (excluidos los mapas)
Hasta Java 1.4 las colecciones son débilmente tipadas
Todas las colecciones concretas deben proveer un iterador
Permite navegar los elementos de la colección sin revelar su estructura interna
Extiende de la interfaz java.util.Collection
No admite elementos duplicados
No agrega nuevos métodos a la interfaz
Ordenado o desordenado
Extiende la interfaz java.util.Collection
Colección ordenada o “secuencia”
Acepta elementos duplicados
Permite el acceso posicional
Extiende la interfaz java.util.Iterator
Pensado para recorrer listas
Agrega las funcionalidades:₋ Iteración bidireccional₋ Reemplazo de
elementos₋ Inserción de elementos₋ Consulta de índice
posterior y siguiente (posición en la recorrida)
Extiende la interfaz java.util.Set
Set cuyos elementos son ordenados automáticamente₋ Ordenamiento
natural (Comparable)₋ Ordenamiento
mediante un Comparator provisto en tiempo de instanciación del set
NO extiende la interfaz java.util.Collection
Representa un mapa de claves (objeto) a valores (objeto)
Cada clave asocia a los sumo un valor
Extiende la interfaz java.util.Map
Mappings ordenados por clave₋ Orden natural
(Comparable)₋ Comparator provisto
en tiempo de instanciación del mapa
Es importante contar con la capacidad de ordenar una colección de objetos por diferentes criterios.
Orden natural: un objeto “ordenable” debe implementar la interfaz java.lang.Comparable.
Las colecciones (mapas) “ordenables” automáticamente (inserción) esperan elementos (claves) comparables
Si el objeto no implementa la interfaz Comparable, o si necesito ordenarlos por un criterio diferente al por defecto, se debe utilizar un comparador externo que implemente la interfaz java.util.Comparator
Java.lang.Comparable Java.lang.Comparator
int obj1.compareTo(obj2) int compareTo(obj1, obj2)
Retorna: - < 0 – si obj1 < obj2 - > 0 – si obj1 ? obj2 - 0 – si obj1 == obj2
Igual que Comparable
Se deben modificar las clases cuyas instancias se quieren ordenar.
Se crea una clase por separado, definiendo el criterio.
Se puede crear una sola secuencia/criterio de ordenamiento
Se pueden crear n criterios
Implementaciones de java.util.List
₋ java.util.ArrayList₋ Implementación de array redimensionable₋ Esencialmente un Vector no sincronizado₋ Es la mejor implementación de la interfaz List
₋ java.util.LinkedList₋ Implementación de lista doblemente encadenada ₋ Podría proveer mejor performance que ArrayList si los
elementos son insertados o borrados frecuentemente₋ Útil para colas (Queues) y colas dobles (Deque)
Implementaciones de java.util.Set
₋ java.util.HashSet₋ Implementación de Set mediante tablas de hash₋ Desordenado₋ Implementación preferida de la interfaz
₋ java.util.LinkedHashSet₋ Implementacón ordenada mediante LinkedList y
HashSet₋ Performance cercana a la del HashSet
₋ java.util.TreeSet₋ Implementa java.util.SortedSet mediante TreeMap₋ Ordenado₋ Garantiza O(log(n)) para las operaciones básicas (add,
remove, contains)
Implementaciones de java.util.Map
₋ java.util.HashMap₋ Implementación desordenada mediante tabla de hash₋ Básicamente tabla de hash no sincronizada₋ Soporta claves y valores null₋ O(k) para las operaciones básicas (get y put) si la
función de hash tiene una buena dispersión sobre los bucketts
Implementaciones de java.util.Map
₋ java.util.TreeMap₋ Implementación ordenada basada en “Red-black tree”
(árbol B binario simétrico)₋ “Red-Black tree” – árbol binario de búsqueda auto
balanceable (Rudolf Bayer 1972)₋ Garantiza O(log(n)) para las operaciones de búsqueda,
inserción y borrado
Implementaciones de java.util.Map
₋ java.util.LinkedHashMap₋ Implementación mediante tabla de hash y lista
encadenada₋ Ordenado por el órden de inserción de los elementos₋ Desempeño cercano al de HashMap₋ Útil para la construcción de cachés₋ El orden no se ve afectado por la reinserción de claves
Colecciones y mapas inmutables La clase java.util.Collections provee los siguientes
métodos para “decorar” colecciones y mapas devolviendo versiones inmutables de las mismas
₋ Collection unmodifiableCollection(Collection collection)
₋ List unmodifiableList(List list) ₋ Map unmodifiableMap(Map map) ₋ Set unmodifiableSet(Set set) ₋ SortedMap unmodifiableSortedMap(SortedMap
map) ₋ SortedSet unmodifiableSortedSet(SortedSet set)
Map Collections.singletonMap(Object key, Object value)
₋Retornan una colección (o mapa) inmutable conteniendo únicamente el elemento especificado
List Collections.nCopies(int n, Object o)₋Retorna una lista inmutable conteniendo n referencias al objeto especificado
La clase java.util.Collections provee, entre otros, los siguientes algoritmos:
₋ void sort(List) – Ordena una lista mediante el algoritmo “merge sort” O(n*log n)
₋ int binarySearch(List, Object) – Busca por bipartición un elemento dentro de una lista ordenada en forma ascendente en órden natural
₋ void reverse(List) – Invierte el orden de los elementos de una lista
₋ void shuffle(List) – Permuta los elementos de una lista en forma aleatoria
₋ void fill(List, Object) – Sobrescribe cada elemento de la lista con el valor recibido
₋ void copy(List dest, List src) – Copia la lista origen sobre la lista destino
₋ Object min(Collection) – Retorna el menor elemento de la colección (órden natural)
₋ Object max(Collection) - Retorna el mayor elemento de la colección (órden natural)
₋ void rotate(List list, int distance) – Rota todos los elementos de la lista la distancia especificada
₋boolean replaceAll(List list, Object oldVal, Object newVal) – Reemplaza todas las ocurrencias de oldVal con newVal
₋int indexOfSubList(List source, List target) – Retorna el índice de la primer ocurrencia de la sub lista target en la lista source
₋int lastIndexOfSubList(List source, List target) - Retorna el índice de la última ocurrencia de la sub lista target en la lista source
₋void swap(List list, int, int) – Intercambia los elementos de las posiciones especificadas
Contiene una serie de métodos para manipular arrays₋ Ordenamiento₋ Búsqueda₋ Etc
Contiene un factory method estático que permite representar arrays como listas
Problema – antes de J2SE5.0
₋ Iterar sobre colecciones es dificil₋ Iterator solo es util para obtener los elementos.₋ Es propenso a errores.
₋ Los métodos que modifican la estructura (ejemplo: remove) no son intuitivos
Solución – nuevamente el complilador trabaja por nosotros
₋ Nueva sintaxis del loop₋ For (variable : Collection)
₋ Trabaja sobre colecciones y arrays
Viejo código (< J2SE5.0)
void cancelAll(Collection c) {for (Iterator i = c.iterator(); i.hasNext(); ){
TimerTask task = (TimerTask)i.next();task.cancel();
}}
Nuevo código (J2SE5.0 !)
void cancelAll(Collection<TimerTask> c) {for (TimerTask task : c)task.cancel();
}
Principales interfaces Ordenamiento: Comparable, Comparator Implementaciones concretas
₋ Implementaciones de propósito general₋ Wrappers (decorators)₋ Conveniencias (mini implementaciones útiles)₋ Implementaciones legadas₋ Implementaciones de propósito especial
Algoritmos La interfaz java.util.RandomAccess La clase java.util.Arrays
The Java TutorialTrail de coleccioneshttp://java.sun.com/docs/books/tutorial/index.html
Thinking in Java, 3rd editionBruce Eckelhttp://www.odioworks.com/46-Bruce_Eckel's_Free_Electronic_Books.html