La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Técnicas avanzadas en java 1.4 y java 5.0

Presentaciones similares


Presentación del tema: "Técnicas avanzadas en java 1.4 y java 5.0"— Transcripción de la presentación:

1 Técnicas avanzadas en java 1.4 y java 5.0
CJ02 Técnicas avanzadas en java 1.4 y java 5.0 Parte 2: Coleccione as en java 1.4

2 Curso de java básico (scjp)

3 Objetivos generales 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

4 Definiciones 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 Entre algunos ejemplos de colecciones, tenemos por ejemplo una mano de truco (colección de cartas), una carpeta de correo electrónico (colección de mails) o un directorio telefónico (un mapa de nombres a números telefónicos). A diferencia de los arreglos, las colecciones solamente mantienen referencias a objetos de tipo Object, por lo que cualquier objeto puede ser almacenado en una colección.

5 Introducción 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 API Collections fue incorporado en la versión de 1.2 de Java y su objetivo principal es el proporcionar una serie de clases e interfaces para manejar diversos conjuntos de datos de una manera estándar. Previamente a Java 2, la API contaba con un conjunto pequeño de clases, entre las cuales encontramos: Vector, Stack, , Hashtable, BitSet, y la interfaz Enumeration, la cual provee un mecanismo abstracto para recorrer elementos en una estructura arbitraria. Con la versión de Java 2, se intento agregar una libreria pequeña y fácil de utilizar, sin ser tan compleja como la Standard Template Library (oSTL) de C++, pero definiendo algoritmos genéricos .

6 Introducción ¿Qué provee el framework? Interfaces Clases concretas
Algoritmos Todas interfaces y clases estándar se encuentran en el paquete java.util Interfaces: son contratos con funcionalidades. Clases concretas: distintas implementaciones del framework, Java provee un conjunto de implementaciones por defecto para todas las interfaces Algoritmos: son provistos por clases utilitarias, los cuales están programados en términos de las interfaces. Por ejemplo ordenamiento. Dentro de los beneficios del “Java Collections Framework” encontramos: Reduce el esfuerzo de programación: ya que las estructuras de datos y algorítmos estándar son útiles. Incrementa calidad y velocidad de los programas, ya que provee implementaciones performantes y de calidad. Reduce la el esfuerzo de aprendizaje: ya que se utilizan las interfaces existentes, de las cuales existe variada documentación. Fomenta la reutilización: dado que se reutilizan las interfaces y clases existentes en distintos sistemas.

7 Principales Interfaces
Como vemos en la imagen, en el paquete java.util, se definen dos interfaces: Collection y Map. Collection Contenedor simple de objetos no ordenados. Los duplicados son permitidos. List Contenedor de elementos ordenados. Set Colección desordenada de objetos. Los duplicados no son permitidos. SortedSet: está ordenada. Map Colección de pares: clave/valor. La clave es usada para indexar el elemento. SortedMap: esta ordenado por clave.

8 Interfaz java.util.Collection
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 En este caso, vemos la interfaz Collection, junto con todos los métodos proporcionados. Hasta Java 1.4, las colecciones no son tipadas. Luego de Java 5, se comienza el uso de Generics. Este tema lo veremos más adelante en detalle.

9 Interfaz java.util.Iterator
Todas las colecciones concretas deben proveer un iterador Permite navegar los elementos de la colección sin revelar su estructura interna Esta interfaz, nos permite recorrer , iterar sobre una colección. hasNext() – nos permite saber si hay un próximo elemento. next() – retorna el próximo elemento de la colección. remove() – borra un elemento de esa colección.

10 Interfaz java.util.Set Extiende de la interfaz java.util.Collection
No admite elementos duplicados No agrega nuevos métodos a la interfaz Ordenado o desordenado Esta interfaz, extiende la interfaz Collection. Los métodos son sobre escritos de manera que no admita elementos duplicados. add() – agrega un elemento addAll() – agrega una colección de elementos. clear() – borra todos los elementos. contains() – retorna true, si contiene el elemento element. containsAll() – retorna true, si contiene la colección collection. equals() – método para comparar objetos. iterator() – iterador para recorrer la colección. remove() – borra el elemento removeAll() – borra la colección. size() – retorna el tamaño de la colección. toArray() – transforma la colección a un array. retainAll() – retorna true si dicha colección, retiene la colección pasada por parámetro.

11 Interfaz java.util.List
Extiende la interfaz java.util.Collection Colección ordenada o “secuencia” Acepta elementos duplicados Permite el acceso posicional La interfaz List, también extiende la interfaz Collection. Los métodos extendidos son básicamente los definidos en la interfaz Collection, pero estos son sobre escritos para manejar colecciones ordenadas, que acepta elementos duplicados.

12 Interfaz java.util.ListIterator
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) Esta interfaz extiende de la interfaz Iterator, la cual es utilizada para recorrer listas. A diferencia de la interfaz Iterator, esta agrega ciertas funcionalidades como ser: hasPrevious() previous() previousIndex() add() set()

13 Interfaz java.util.SortedSet
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 Los métodos headSet, subSet y tailSet generan “vistas” sobre el Set, donde cambios sobre estas vistas afectan el Set original.

14 Interfaz java.util.Map NO extiende la interfaz java.util.Collection
Representa un mapa de claves (objeto) a valores (objeto) Cada clave asocia a los sumo un valor Un map, es una estructura doble: clave valor. Un claro ejemplo es una agenda telefónica, donde las letras del abecedario son las claves, y los teléfonos son los valores. Los maps, no permiten claves repetidas. El método hashCode() de la clase Object provee el identificador único del objeto (clave única). Este método debe ser sobreescrito.

15 Interfaz java.util.SortedMap
Extiende la interfaz java.util.Map Mappings ordenados por clave Orden natural (Comparable) Comparator provisto en tiempo de instanciación del mapa El SortedMap es similar a la estructura Map, pero ordenado según las claves.

16 Ordenamiento 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 Para ordenar colecciones, se puede utilizar la interfaz Comparable, la cual define el método de comparación: compareTo(). Veamos un ejemplo: public class Usuario implements Comparable{ private String nombre; private int edad; public Usuario(String nombre, int edad) { this.nombre = nombre; this.edad = edad; } public String getNombre() { return nombre; } public int getEdad() { return edad; } public String toString() { return nombre + " (" + edad + ")"; } public int compareTo(Object o) { Usuario1 otroUsuario = (Usuario1) o; //podemos hacer esto porque String implementa Comparable return nombre.compareTo(otroUsuario.getNombre()); }

17 Ordenamiento 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 En este ejemplo, vemos que la clase Usuario, implementa la interfaz comparator, por lo que define el método compareTo, para comparar usuarios. Ahora bien, para utilizar el ordenamiento, veamos el siguiente ejemplo: ArrayList<Usuario> lista = new ArrayList <Usuario> (); lista.add(new Usuario1("uno", 11)); lista.add(new Usuario1("dos", 2)); lista.add(new Usuario1("tres", 3)); lista.add(new Usuario1("cuatro", 44)); printList(lista); System.out.println("\n Ahora ordenados..."); Collections.sort(lista); //método que imprime la lista Como vemos, para ordenar una lista, basta con escribir:

18 Ordenamiento 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

19 Implementaciones de Propósito General
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) LinkedList: Una lista de tipo LinkedList, está ordenada por un índice de posición, como los ArrayList, pero estas se encuentran doblemente encadenadas. Si bien la iteración de una LinkedList es mas lenta que la iteración sobre un ArrayList, es útil cuando se necesita una rápida inserción y borrado de elementos. En Java 5, este tipo de listas han sido mejoradas para que éstas puedan implementar la interfaz java.util.Queue. ArrayList: Este tipo de listas nos permiten una rápida iteración sobre los elementos de la misma, así como también el acceso random a los elementos.

20 Implementaciones de Propósito General
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 HashSet: Es un set desordenado, el cual utiliza hashcode del objeto que es insertado, por lo que cuanto más eficiente sea la implementación de hashCode(), mejor será la performance de acceso. Este set, es recomendable ser utilizado, cuando necesites manejar una colección sin duplicados y no sea importante el orden en el cual se itere sobre sus elementos. LinkedHashSet : Es una versón ordenada de HashSet que mantiene una lista doble encadenada. En este caso, es recomendable su uso, cuando el orden de iteración de los elementos sea de importancia.

21 Implementaciones de Propósito General
java.util.TreeSet Implementa java.util.SortedSet mediante TreeMap Ordenado Garantiza O(log(n)) para las operaciones básicas (add, remove, contains) TreeSet: Es una de las dos colecciones ordenadas, la otra es TreeMap. Ésta utiliza una estructura Red-Black (árbol balanceado), que garantiza que los elementos estén en orden ascendente.

22 Implementaciones de Propósito General
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 HashMap:La iteración requiere tiempo proporcional a la “capacidad” (# bucketts) de la instancia + el “tamaño” (# mappings) Es importante no setear muy grande la capacidad inicial (o muy chico el factor de carga) si es importante la performance de las iteraciones Un hashmap, es una estructura de tipo (clave, valor), donde la clave es un elemento único. Un ejemplo muy claro sería una agenda telefónica, donde las letras del abecedario serían las claves, y los valores estarían dados por una lista elementos que poseen los números telefónicos. Al igual que los Sets, los hasmaps recaen sobre el método equals(), para determinar si dos claves son iguales o diferentes.

23 Implementaciones de Propósito General
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 TreeMap: Es un Map ordenado; al igual que un TreeSet, los TreeMaps permiten definir un criterio para ordenar elementos, utilizando Comparable o Comparator.

24 Implementaciones de Propósito General
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 Como los LinkedHashSet, los LinkedHashMap mantienen la inserción de elementos de forma ordenada, la cual puede ser más lenta que en un HashMap.

25 Implementaciones de Propósito General

26 Wrappers(Decorator) 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) Son implementaciones que delegan el trabajo a una coleccion específica de manera que agrega funcionalidad extra. Estas funciones, retornan una coleccion que no puede ser modificada, son solo de lectura; por lo que si se trata de modificar dicha collection, el reultado es una exeption de tipo: UnsupportedOperationException.

27 Conveniencias 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 Ejemplos: Map<Integer, String> singletonMap=Collections.singletonMap(1,"Valor - Elemento 1"); //obtenemos un map con el elemento (1,"Valor - Elemento 1"); System.out.println(singletonMap.get(1).toString()); singletonMap.put(2, "Valor 2");// al intentar agregar un elemento, obtenemos una exception. List copies=Collections.nCopies(3,singletonMap);//creamos 3 copias del map Obtenemos: Exception in thread "main" java.lang.UnsupportedOperationException //al querer modificar el map at java.util.AbstractMap.put(Unknown Source) at test.main(test.java:18) Valor - Elemento 1

28 Algoritmos 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 Ejemplos de uso: public class Sort { public static void main(String[] args) { //ordena la lista, según criterios de Strings. List<String> list = Arrays.asList(args); Collections.sort(list); System.out.println(list); // buscamos la clave key en la lista, y esta es insertada en cierta posicion, si esta // no pertenece a list int pos = Collections.binarySearch(list, key); if (pos < 0) l.add(-pos-1); //invierte el orden de los elementos de una lista Collections.reverse(list) //permuta los elementos de una lista Collections.shuffle(list) }

29 Algoritmos 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 //sobreescribe los elementos List list = new ArrayList();     for (int i = 0; i < 10; i++)        list.add("");     Collections.fill(list, "Hello");     System.out.println(list); //copia list en listCopy List listCopy = new ArrayList(); Collections.copy(list, listCopy); listCopy.clear(); listCopy.add(¨1¨); listCopy.add(¨2¨); listCopy.add(¨3¨); Collections.min(listCopy); //retorna 1 Collections.max(listCopy); //retorna 3

30 Algoritmos 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 Ejemplos: List <Integer> lista= new ArrayList<Integer>(); for (int i = 0; i < 10; i++) lista.add(i); Collections.replaceAll(lista, 1, 9); //remplazamos las ocurrencias de 1s por 9s. //Collections.replaceAll(lista, 1, 9); List<Integer> target= new ArrayList<Integer>(); for (int i = 5; i < 10; i++) target.add(i); System.out.println(Collections.indexOfSubList(lista, target)); //retorna 5, dado que es la posicion de la primera ocurrencia de la sublista target en la lista. System.out.println(Collections.lastIndexOfSubList(lista, target)); //retorna 5, dado que es la posicion de la ultima ocurrencia de la sublista. Collections.swap(lista, 1, 3); //intercambia el elemento de la posicion 1 por el de la posicion 3

31 Interfaz java.util.Arrays
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

32 Caracteristicas de Java 1.5 y mayores

33 for - mejorado 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

34 for - mejorado Solución – nuevamente el complilador trabaja por nosotros Nueva sintaxis del loop For (variable : Collection) Trabaja sobre colecciones y arrays

35 for - mejorado Viejo código (< J2SE5.0)
void cancelAll(Collection c) { for (Iterator i = c.iterator(); i.hasNext(); ){ TimerTask task = (TimerTask)i.next(); task.cancel(); } La sintaxis utilizada en este caso, requiere castear y definir las variables utilizadas. Sin embargo, en el for introducido en la versión de Java 5, el casting es de forma automática.

36 for - mejorado Nuevo código (J2SE5.0 !)
void cancelAll(Collection<TimerTask> c) { for (TimerTask task : c) task.cancel(); } Como vemos, la sintaxis es mucho más simple, y de esta forma podemos obtener los objetos de una colección de forma fácil. Como mencionamos anteriormente, en este caso, no es necesario castear la variable task, sino que esta es definida en el loop.

37 Resumen 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

38 Referencias The Java Tutorial Trail de colecciones Thinking in Java, 3rd edition Bruce Eckel


Descargar ppt "Técnicas avanzadas en java 1.4 y java 5.0"

Presentaciones similares


Anuncios Google