Académique Documents
Professionnel Documents
Culture Documents
TRUJILLO
INGENIERÍA DE SISTEMAS
DOCENTE:
Mg. Vidal Melgarejo, Zoraida Yanet
ALUMNOS:
2018
TECNOLOGÍA DE LA PROGRAMACIÓN
ÍNDICE
I. INTRODUCCIÓN………………………………………………………………...........................................1
II. CUERPO……………………………………………………………………………………………………………………2
2.1. DEFINICIÓN………………………………………………………………………………………………….4
2.2. LA INTERFAZ COLLECTION……………………………………………………………………………4
2.3. TIPOS DE COLECCIONES EN JAVA…………………………………………………………………5
2.3.1. SET…………………………………………………………………………………………………………5
2.3.2. LIST………………………………………………………………………………………………………..8
2.3.3. QUEUE………………………………………………………………………………………………….11
2.3.4. MAPS……………………………………………………………………………………………………17
2.4. VENTAJAS Y DESVENTAJAS DE LAS COLECCIONES………………………………………19
2.5. CONCLUSIÓN……………………………………………………………………………………………..20
III. BIBLIOGRAFÍA…………………………………………………………………………………………………………21
UNT|GRUPO 2 2
TECNOLOGÍA DE LA PROGRAMACIÓN
COLECCIONES EN JAVA
I. INTRODUCCIÓN
Las estructuras de datos en Java ofrecen muchas posibilidades y variantes. Por ejemplo, podemos
tener conjuntos sin orden entre los elementos, pero también conjuntos ordenados. Y podemos
tener colas donde el objeto que sale primero no es el primero que llegó, sino el que tiene mayor
prioridad o “urgencia” por salir. Para escoger un tipo de comportamiento u otro existen distintas
clases que se catalogan como colecciones en el API de Java. Incluso existen clases que sirven para
agrupar objetos que Java no clasifica como colecciones, aunque su funcionamiento es muy similar.
Sería el caso de los Maps, objetos que contienen parejas de objetos donde un elemento sirve para
encontrar al otro, al igual que un listín telefónico contiene parejas “Nombre de personas – Datos
de dirección y teléfono” y el nombre de persona es lo que nos sirve para encontrar sus datos
asociados. En la nomenclatura de Java, los Maps no son colecciones. Por eso a veces se usa el
término “contenedores de objetos” para hacer referencia a listas, conjuntos, colas, mapas, etc.
que al fin y al cabo son objetos que contienen más objetos (como una caja que contiene más
cajas).
¿Cómo saber qué clase elegir? Hay varios factores a tener en cuenta, entre ellos el número de
datos que tenemos que gestionar (no es lo mismo trabajar con una colección de 50 objetos que
con una colección de 50.000 objetos) y el tipo de procesos que tenemos que realizar con ellos (no
es lo mismo una lista en que los nuevos elementos se añaden casi siempre al final de la lista que
una lista donde los nuevos elementos se añaden frecuentemente en posiciones intermedias).
Cada clase resulta más eficiente que otra para realizar determinados procesos. Esto es de especial
interés cuando hay que gestionar muchos datos. Si hablamos de sólo unas decenas de datos no
vamos a ser capaces de apreciar diferencias de rendimientos.
La plataforma Java nos proporciona un amplio conjunto de clases dentro del que podemos
encontrar tipos de datos que nos resultarán muy útiles para realizar la programación de
aplicaciones en Java. Estos tipos de datos nos ayudarán a generar código más limpio de una forma
sencilla.
Se proporcionan una serie de operadores para acceder a los elementos de estos tipos de datos.
Decimos que dichos operadores son polimórficos, ya que un mismo operador se puede emplear
para acceder a distintos tipos de datos. Por ejemplo, un operador add utilizado para añadir un
elemento, podrá ser empleado tanto si estamos trabajando con una lista enlazada, con un array,
o con un conjunto por ejemplo.
Este polimorfismo se debe a la definición de interfaces que deben implementar los distintos tipos
de datos. Siempre que el tipo de datos contenga una colección de elementos, implementará la
interfaz Collection. Esta interfaz proporciona métodos para acceder a la colección de elementos,
que podremos utilizar para cualquier tipo de datos que sea una colección de elementos,
independientemente de su implementación concreta.
UNT|GRUPO 2 3
TECNOLOGÍA DE LA PROGRAMACIÓN
Podemos encontrar los siguientes elementos dentro del marco de colecciones de Java:
Interfaces para distintos tipos de datos: Definirán las operaciones que se pueden realizar con
dichos tipos de datos. Podemos encontrar aquí la interfaz para cualquier colección de datos,
y de manera más concreta para listas (secuencias) de datos, conjuntos, etc.
Implementaciones de tipos de datos reutilizables: Son clases que implementan tipos de datos
concretos que podremos utilizar para nuestras aplicaciones, implementando algunas de las
interfaces anteriores para acceder a los elementos de dicho tipo de datos. Por ejemplo,
dentro de las listas de elementos, podremos encontrar distintas implementaciones de la lista
como puede ser listas enlazadas, o bien arrays de capacidad variable, pero al implementar la
misma interfaz podremos acceder a sus elementos mediante las mismas operaciones
(polimorfismo).
Algoritmos para trabajar con dichos tipos de datos, que nos permitan realizar una ordenación
de los elementos de una lista, o diversos tipos de búsqueda de un determinado elemento,
por ejemplo.
UNT|GRUPO 2 4
TECNOLOGÍA DE LA PROGRAMACIÓN
UNT|GRUPO 2 5
TECNOLOGÍA DE LA PROGRAMACIÓN
UNT|GRUPO 2 6
TECNOLOGÍA DE LA PROGRAMACIÓN
Una vez explicados los distintos tipos de Set, veremos cómo se crean y mostraremos
sus diferencias en los tiempos de inserción. Como hemos visto anteriormente, el más
rápido debería ser HashSet mientras que, por otro lado, el más lento debería
ser TreeSet. Vamos a comprobarlo con el siguiente código:
UNT|GRUPO 2 7
TECNOLOGÍA DE LA PROGRAMACIÓN
B. List (Lista)
Una lista es una colección ordenada de elementos que, a diferencia de la colección
Set, si puede contener elementos duplicados. Es una interfaz que “extiende” la
interfaz Collection. Las Listas están clasificadas como sigue:
1. ArrayList
2. LinkedList
ArrayList:
Sintaxis:
object2.add("2"); //Error
object2.add(3); //Ok
object2.add('c'); //Error
object2.add("Hola"); //Error
UNT|GRUPO 2 8
TECNOLOGÍA DE LA PROGRAMACIÓN
Método Descripción
LinkedList
LinkedList es una secuencia de Links que contienen elementos. Cada link contiene una
conexión con otro link.
Sintaxis
UNT|GRUPO 2 9
TECNOLOGÍA DE LA PROGRAMACIÓN
LinkedList doble: Cada nodo guarda el dato de este, y dos referencias: al nodo
anterior y al nodo siguiente.
Método Descripción
UNT|GRUPO 2 10
TECNOLOGÍA DE LA PROGRAMACIÓN
linked.forEach((o) -> {
System.out.println(o.getClass());
}); //Lista todos los elementos
C. Queue y Deque
Se conoce como cola a una colección especialmente diseñada para ser usada como
almacenamiento temporario de objetos a procesar. Las operaciones que suelen
admitir las colas son “encolar”, “obtener siguiente”, etc. Por lo general las colas siguen
un patrón que en computación se conoce como FIFO (por la sigla en inglés de “First In
- First Out” - “lo que entra primero, sale primero”), lo que no quiere decir otra cosa que
lo obvio: El orden en que se van obteniendo los “siguientes” objetos coincide con el
orden en que fueron introducidos en la cola.
Ventajas:
Muy rápido acceder al primero y último elemento.
Permite crear colas de elementos muy eficientes. (LIFI, FIFO)
UNT|GRUPO 2 11
TECNOLOGÍA DE LA PROGRAMACIÓN
Inconvenientes:
Acceso lento a los elementos intermedios.
Para implementar una cola FIFO en Java la única opción provista por la biblioteca de
colecciones era LinkedList. Esta implementación ofrece una implementación eficiente
de las operaciones “poner primero” y “sacar último”. Sin embargo, aunque la
implentación es la correcta, a nivel de interfaz dejaba algo que desear. Los métodos
necesarios para usar una LinkedList como una cola eran parte solamente de la clase
LinkedList, no existía ninguna interfaz que abstraiga el concepto de “cola”. Esto hacía
imposible crear código genérico que use indistintamente diferentes implementaciones
de colas (que por ejemplo no sean FIFO sino que tengan algún mecanismo de
prioridades). Esta situación cambió recientemente a partir del agregado a Java de dos
interfaces expresamente diseñadas para el manejo de colas: La interfaz Queue tiene
las operaciones que se esperan en una cola. También se creó Deque, que representa a
una “double-ended queue”, es decir, una cola en la que los elementos pueden añadirse
no solo al final, sino también “empujarse” al principio.
LinkedList
Se utiliza la clase LinkedList que implementa una interfaz simple de cola, se añaden
items a la cola utilizando los métodos ADD() y OFFER(). La diferencia que existe entre
ellos es que el método ADD() terminará botando una excepción si es que existe un
problema al añadir un item en la cola, mientras que el método OFFER() solo retornará
falso en caso de que exista el mismo problema. Cual de estos métodos usar depende
de que sistema se desea implementar.
El ejemplo también muestra como eliminar items de la cola utilizando los métodos
REMOVE() y POLL(). Como los métodos previamente mencionados para poder añadir
items a la cola, uno de ellos retornará una excepción si algo sale mal (en este caso, que
no exista ningún item en la cola que se pueda eliminar), mientras que el otro solo
retorna falso.
Exactamente el mismo proceso se aplica para los dos métodos que son utilizados para
UNT|GRUPO 2 12
TECNOLOGÍA DE LA PROGRAMACIÓN
obtener el primer item que está en la cola. A continuación se explica a mas detalle el
código:
/**
*
* @author Silviu Stroe (latzro.com)
*/
/**
* Metodo de ejemplo para una cola
*/
public void queueExample() {
UNT|GRUPO 2 13
TECNOLOGÍA DE LA PROGRAMACIÓN
/**
* @param args the command line arguments
*/
ArrayDeque
Podemos agregar y remover tanto al inicio como el final de esta colección, la
implementación de matriz de tamaño variable de la interfaz de Deque. Arreglos deques
no tienen restricciones de capacidad; crecen según sea necesario para soportar el uso.
No son seguros para los hilos; en ausencia de sincronización externa, no admiten el
acceso simultáneo de varios subprocesos. Los elementos nulos están prohibidos. Es
probable que esta clase sea más rápida que la Pila cuando se usa como una pila, y más
rápida que la Lista Vinculada cuando se usa como una cola.
La mayoría de las operaciones de ArrayDeque se ejecutan en tiempo constante
amortizado. Las excepciones incluyen remove, removeFirstOccurrence,
removeLastOccurrence, contiene, iterator.remove () y las operaciones masivas, todas
las cuales se ejecutan en tiempo lineal.
Constructores públicos
ArrayDeque()
Construye un arreglo de matriz vacío con una capacidad inicial suficiente para
albergar 16 elementos.
UNT|GRUPO 2 14
TECNOLOGÍA DE LA PROGRAMACIÓN
ArrayDeque(int numElements)
Construye un arreglo de matriz vacío con una capacidad inicial suficiente para
contener el número especificado de elementos.
ArrayDeque(Collection<? extends E> c)
Construye un deque que contiene los elementos de la colección especificada, en el
orden en que son devueltos por el iterador de la colección.
Vamos ahora con un ejemplo práctico:
PriorityQueue
Se utiliza una PriorityQueue cuando se supone que los objetos deben procesarse según
la prioridad. Se sabe que una cola sigue el algoritmo de Primero en entrar, primero en
salir, pero a veces los elementos de la cola deben procesarse de acuerdo con la
prioridad, que es cuando el PriorityQueue entra en juego.
UNT|GRUPO 2 15
TECNOLOGÍA DE LA PROGRAMACIÓN
UNT|GRUPO 2 16
TECNOLOGÍA DE LA PROGRAMACIÓN
D. Maps
La interfaz Map asocia claves a valores. Esta interfaz no puede contener claves
duplicadas y; cada una de dichas claves, sólo puede tener asociado un valor como
máximo.
UNT|GRUPO 2 17
TECNOLOGÍA DE LA PROGRAMACIÓN
operaciones básicas siempre y cuando la función hash disperse de forma correcta los
valores. Es bastante más lento que HashMap. Las claves almacenadas deben
del Map si dos o más hilos acceden de forma concurrente al mismo. Esto se puede solucionar
empleando una serie de métodos que actúan de wrapper para dotar a estas colecciones de
UNT|GRUPO 2 18
TECNOLOGÍA DE LA PROGRAMACIÓN
elementos.
UNT|GRUPO 2 19
TECNOLOGÍA DE LA PROGRAMACIÓN
2.5. CONCLUSIÓN
Como hemos visto a lo largo del desarrollo del tema, las colecciones en Java proporcionan
una serie de estructuras muy variadas para almacenar datos. Estas estructuras, ofrecen
diversas funcionalidades: ordenación de elementos, mejora de rendimiento, rango de
operaciones… Es importante conocer cada una de ellas para saber cuál es la mejor
situación para utilizarlas. Un buen uso de estas estructuras mejorará el rendimiento de
nuestra aplicación.
Para conocer qué tipo de colección usar, podemos emplear el siguiente diagrama:
UNT|GRUPO 2 20
TECNOLOGÍA DE LA PROGRAMACIÓN
III. BIBLIOGRÁFIA
https://www.adictosaltrabajo.com/2015/09/25/introduccion-a-colecciones-en-
java/
http://di002.edv.uniovi.es/~cueva/asignaturas/extension/2006/Java/files/coleccio
nes.pdf
http://www.jtech.ua.es/j2ee/publico/lja-2012-13/sesion02-apuntes.html
https://www.youtube.com/watch?v=1JlTVtrHdKs
https://www.youtube.com/watch?v=bTu-fz1JmWQ&t=720s
https://es.slideshare.net/rennybatista/java-colecciones
https://es.slideshare.net/JahyrAndre/colecciones-en-java-76602029
DEAN, John & DEAN, Raymond. Introducción a la programación con Java. 1ra ed.
México. Mc Graw Hill. 2008. 730 p. ISBN: 978-970-10-7278-3.
UNT|GRUPO 2 21