Los arrays nos ofrecen una interesante forma de estructurar datos en la memoria, pero tienen el problema de que es necesario saber previamente la longitud o número de elementos que tendrá cada array.
Al trabajar con arrays nos encontrado con una serie de inconvenientes:
- Todos los elementos del array deben ser del mismo tipo
- Al crear el array debemos poner un tamaño inicial, me refiero a especificar el número de elementos que va a contener.
- Los arrays no se pueden redimensionar ya que son estructuras estáticas.
Las colecciones son otra alternativa a los arrays que me permiten almacenar varios elementos en la misma estructura y soluciona los inconvenientes anteriores:
- Los elementos de las colecciones se almacenan como Object por lo cual me permite guardar cualquier tipo de elemento.
- No necesitamos especificar de inicio el número de elementos que va a contener.
- Son estructuras dinámicas por lo cual puedo ir añadiendo tantos elementos como quiera que la colección los admite sin problemas.
API COLLECTIONS
El API Collections contiene interfaces que permiten agrupar objetos en una de las siguientes colecciones:
- Collection; Un grupo de objetos denominados elementos, la implementación determina si guardan un orden específico y si se permiten elementos duplicados.
- Set; Es un tipo de colección donde no se garantiza que se conserve el orden de entrada de los elementos. Tampoco permite elementos duplicados.
- List – En esta colección si se garantiza el orden de entrada y si que se permiten los elementos duplicados.

A continuación presentamos una tabla donde se recogen las principales clases que implementan las colecciones.

- Iterable: Las clases que implementan la interfaz Iterable tienen la característica de que sus elementos pueden recorrerse con una estructura de tipo foreach y además poseen el método iterator(). Trabajaremos con estos conceptos más adelante.
- Map: Los mapas asocian una clave a cada elemento, que servirá después como llave para acceder a dicho elemento.
- Collection: Las clases que implementan la interfaz Collection representan una colección dinámica de objetos. Internamente trabajan con arrays.
- List: Interfaz que implementa las colecciones de datos que se organizan en forma de lista, es decir, un elemento detrás de otro en el orden en que se van introduciendo.
- Queue: Las clases que implementan la interfaz Queue representan colecciones cuyos elementos se organizan en forma de cola. Una cola es una estructura de datos en memoria RAM donde el primer elemento que entró, es el primero en salir. También se denominan estructuras FIFO, abreviatura del inglés “First In, First Out”.
- Set: Conjuntos: los elementos que se añaden no se sitúan en el orden natural en que se van introduciendo. La característica más importante de los conjuntos es que no admiten valores duplicados.
- HashMap: Colección de elementos donde cada elemento tiene asociada una clave. Los elementos no se sitúan en el orden en que se van añadiendo
- SortedMap: Interfaces cuyas clases que la implementan representan mapas cuyos elementos quedan ordenados según la clave.
- TreeMap: Colección de elementos donde cada elemento tiene asociada una clave. Los elementos se sitúan en orden de clave.
- Vector: Lista basada en un array tipo vector con una longitud inicial de 10 elementos, que irá creciendo en 10 elementos más cuando sea necesario, permitiendo que crezca dinámicamente. Sus métodos son sincronizados, es decir, es útil cuando trabajamos con programas multitarea utilizando distintos hilos de ejecución.
- ArrayList: Lista basada en un array tipo vector con una longitud inicial de 10 elementos, que irá creciendo en 10 elementos más cuando sea necesario, permitiendo que crezca dinámicamente. A diferencia de la clase Vector, sus métodos no son sincronizados.
- LinkedList: Basado en una lista enlazada y con los elementos organizados en forma de cola. Mucho más eficiente que Vector y ArrayListcuando hay que hacer muchas inserciones y eliminaciones.
- HashSet: Colección de objetos que no guardan ningún tipo de orden. Los elementos no se sitúan en el mismo orden que se han ido introduciendo. Puesto que se trata de un conjunto, no admite duplicados, es decir, no admite ningún nuevo elemento que, aplicándole el método equals sobre cualquiera de los existentes, dé true.
- SortedSet: Las clases que implementan esta interfaz representan colecciones de objetos que pueden ordenarse en función del método compareTo de cada elemento con el resto de los elementos, y además no admiten duplicados, puesto que se trata de conjuntos.
- TreeSet: Colección de objetos que pueden ordenarseen función del método compareTo de cada elemento con el resto de los elementos y además, no admiten duplicados, es decir, no admite ningún nuevo elemento que, aplicándole el método equals sobre cualquiera de los existentes, dé true.
- Iterable: Las clases que implementan la interfaz Iterable tienen la característica de que sus elementos pueden recorrerse con una estructura de tipo foreach y además poseen el método iterator().
Principales colecciones
LIST
Una colección de tipo List si que conserva el orden de entrada de los elementos y además permite introducir elementos duplicados.

En este ejemplo vemos como crear una colección de tipo List.
|
1 2 3 4 5 6 7 8 |
// crear una coleccion de tipo List List coleccionList = new ArrayList(); coleccionList.add("uno"); coleccionList.add("segundo"); coleccionList.add(new Integer(4)); coleccionList.add(new Float(3.15)); coleccionList.add("segundo"); // los repetidos SI se a??aden System.out.println(coleccionList); |
Tras la ejecución del código este es el resultado que veremos en la consola.
|
1 |
[uno, segundo. 4, 3.15, segundo] |
Algunos métodos de las Listas
- int size(): El método size devuelve el número de elementos que contiene la lista. En el ejemplo anterior estamos utilizando este método para controlar cuándo deber terminar el bucle for.
- boolean add(Object element): Añade el elemento pasado como argumento al final de la lista. Devuelve true si el elemento se ha añadido con éxito y devuelve false si, por alguna circunstancia, el elemento no se ha podido añadir.
- boolean remove(Object obj): Elimina de la colección el objeto pasado como argumento. Si el objeto no ha podido eliminarse por cualquier circunstancia, devuelve false, de lo contrario devuelve true.
- void clear(): Elimina todos los elementos dejando la colección vacía.
- boolean contains(Object o): Devuelve true si la colección contiene el objeto especificado como argumento, de lo contrario devuelve false.
- boolean isEmpty(): Devuelve true si la colección no contiene ningún elemento, de lo contrario devuelve false.
- Object get(int pos): El método get devuelve el elemento que ocupa la posición especificada como argumento.
- boolean add(int pos, Object element) : También es posible añadir un nuevo elemento en la posición deseada.
Puedes probar a añadir el siguiente código al ejemplo:
|
1 2 3 4 5 6 |
trians.add(1, new Triangulo(7, 8, 9)); System.out.println("Recorriendo de nuevo todos los elementos"); for (int i=0; i<trians.size(); i++) { System.out.println(trians.get(i).verTipo()); } |
El nuevo triángulo de lados 7, 8 y 9 es insertado en la posición 1 y los triángulos que antes ocupaban las posiciones 1 y 2 han sido desplazados una posición.
- Object remove(int pos) : Elimina el elemento que ocupa la posición especificada en el argumento y retorna el elemento borrado. Puedes ponerlo en práctica añadiendo este código:
|
1 2 |
Triangulo t = trians.remove(2); System.out.println("Se ha eliminado el triángulo: " + t.verTipo()); |
Se ha eliminado el elemento que ocupaba la posición indicada y los elementos que le seguían han tenido que desplazarse una posición hacia arriba.
SET
Recordamos que una colección de tipo Set no garantiza el orden de entrada de los elementos y tampoco permite introducir elementos duplicados.

En el siguiente ejemplo vemos como crear una colección de este tipo y añadir unos cuantos elementos.
Si intentamos introducir un elemento repetido simplemente lo ignora sin generar una excepción o error de compilación.
|
1 2 3 4 5 6 7 8 |
Set coleccionSet = new HashSet(); coleccionSet.add("uno"); coleccionSet.add("segundo"); coleccionSet.add(3); coleccionSet.add(new Integer(4)); coleccionSet.add(new Float(3.15)); coleccionSet.add("segundo"); // los repetidos no se a??aden System.out.println(coleccionSet); |
La ejecución de este ejemplo podría mostrar la siguiente salida.
|
1 |
[4,3.15,segundo,uno] |
Los métodos que podemos usar en este tipo de colecciones son los mismos que los utilizados en las listas del punto anterior.
La característica más importante de este tipo de colecciones es que no admiten duplicados
MAP

Un mapa no se considera una colección ya que no hereda de la interface Collection. Los elementos de un mapa se forman como clave-valor. Además tienen las siguientes restricciones:
- Las claves duplicadas no están permitidas.
- Una clave solo puede referenciar un valor, no varios.
La interface Map define una serie de métodos para manipular el mapa, los más interesantes son:
- entrySet; Devuelve una colección de tipo Set con todos los elementos (clave- valor).
- keySet; Devuelve una colección de tipo Set con todas las claves del mapa.
- values; Devuelve un objeto de tipo Collection con todos los valores del mapa.
El API de la interface Map es el siguiente:

Vemos un ejemplo de cómo crear un mapa. Si intentamos introducir un elemento con su clave duplicada, se sobrescribe el valor del elemento.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// crear un Mapa // un mapa no permite claves duplicadas, valores duplicados si. Map mapa = new HashMap(); mapa.put("1", "uno"); mapa.put("2", "dos"); mapa.put("1", "tres"); // sobreescribe el elemento // mostrar todas las claves (keys) System.out.println(mapa.keySet()); // mostrar todos los valores (values) System.out.println(mapa.values()); // mostrar todos los elementos como pares key-value System.out.println(mapa.entrySet()); |
El resultado tras la ejecución sería el siguiente:
|
1 2 3 |
[1,2] [dos,tres] [2=dos, 1=tres] |
Diferencia entre una colección y un mapa
Tanto colecciones como mapas representan un conjunto o colección de elementos, pero hay una importante diferencia entre ambos:
1. Los mapas no implementan las interfaces Iterable y Collection, tal como puedes apreciar en la imagen. En el siguiente apartado aprenderás qué aportan estas interfaces a las clases que las implementan.
2. Técnicamente llamamos colecciones a las clases que implementan la interfaz Collection. Aunque en la práctica también se llama colecciones a los mapas, porque representan una colección o conjunto de elementos. De ahí que ambos conceptos se confundan a menudo.
3. La diferencia importante a nivel operativo es que, aunque tanto mapas como colecciones almacenan una colección o conjunto de objetos, los mapas asocian una clave a cada elemento, que servirá después como llave para acceder a dicho elemento.
Con tantas clases disponibles para construir colecciones de datos, ¿cómo saber la que más nos conviene? La siguiente imagen resume de manera esquemática cómo decidir el tipo de colección que necesitamos:
