Java para programadores – Colecciones

En Java, las colecciones son conjuntos de objetos homogéneos y relacionados que disponen de comportamientos específicos para interactuar con ellos.

Con esta definición, queremos establecer las características que debe tener una colección, y que en Java, esta soportado por interfaces y clases abstractas, y que van mucho mas allá que el array que conocíamos hasta ahora.

Las colecciones tienen como raíz la interface “Collection”, de las que heredan cuatro interfaces distintas:Collection. Colecciones en Java

Set

Es una colección que no puede tener elementos duplicados. Dispone únicamente de los métodos heredados de Collection, mas la restricción para evitar elementos duplicados. Dos objetos Set son iguales cuando contienen los mismos elementos. Hay tres implementaciones:

  • HashSet – Almacena los elementos en una tabla hash, de forma que es la implementación con mejor rendimiento, pero no se puede prever el orden de iteración.
  • TreeSet –  Va guardando los elementos ordenados por valor, o por el resultado del método “compareTo” implementado
  • LinkedHashSet – Es una variante de HashSet que guarda los elementos en el mismo orden en que se cargan

Otra cuestión también importante, es que la InterfaceSet soporta operaciones algebraicas de conjuntos como:

  • s1.containsAll(s2) — devuelve true si s2 es un subconjunto de s1.
  • s1.addAll(s2) — Convierte s1 en la union de s1s2.
  • s1.retainAll(s2) — Convierte s1 en la interseccion de s1s2.
  • s1.removeAll(s2) — Convierte s1 en la diferencia entre s1 and s2. (Esto es: todos los objetos de s1 que no existen en s2)

Los métodos mas importantes a tener en cuenta son:

  • size() – Devuelve el numero de elementos de la colección
  • isEmpty() – Indica si la colección es vacía
  • add() – Añade elemento a la colección, si no está duplicado. Devuelve true si lo ha podido añadir; si no, devuelve false.
  • remove() – Borra un objeto de la colección; y devuelve true si lo ha podido borrar
  • iterator() – Devuelve un objeto Iterator para poder recorrer la colección

List

Se trata de una colección que puede tener elementos duplicados, y que se conservan ordenados.

  • Acceso posicional-Incluye métodos como get, set, add, addAll y remove que permite manipular elementos en función de su posición numérica.
  • Búsqueda- Métodos como indexOf y lastIndexOf que permiten localizar información en la lista, y devuelve su posición numérica
  • Iteracion- Extiende el funcionamiento habitual de Iterator para utilizar ventajosamente las características secuenciales de la lista ( listIterator con métodos añadidos hasPrevious y previous, ademas de un constructor para empezar la iteracion en cualquier punto)
  • Visión por rangos-El método sublist permite trabajar con rangos dentro de la lista

las implementaciones disponibles en el paquete son:

  • ArrayList-Se trata de una implementación semejante a Vector, que proporciona un array al que se le puede ir cambiando el tamaño
  • LinkedList-Es una implementación diferente a ArrayList desde el momento que lo que guarda LinkedList es una lista de punteros hacia donde se encuentran los verdaderos punteros a datos de la colección. Eso hace que en según que operaciones sea mucho mas rápido que el ArrayList (Inserción y borrado de datos), mientras que para otras operaciones, sea mas lento (Búsqueda, recorrido random,…)
  • Vector – Es un ArrayList que trabaja sincronizado, por lo que soporta el acceso desde varios hilos de forma segura
  • Stack– Es una Pila utilizando Vector

Desde java.utilCollection, disponemos de varios métodos estáticos:

  • Ordenar: sort(List, Comparator)
  • Desordenar: shuffle()
  • Busqueda binaria: binarySearch(List,T,Comparator)
  • Informes: frecuency(Collection,object); max(Collection); min(Collection);
  • Manipulacion de datos: reverse, fill, copy, swap, …

Queue

La cola, es , tipicamente, una colección para ir guardando elementos antes de su procesamiento, por ello, ademas de los métodos de “Collection” aporta:

  • element()
  • offer()
  • peek()
  • poll()
  • remove()

Las implementaciones de Queu acostumbran air añadiendo los datos que se le dan en orden FIFO (Primero en entrar-primero en salir) pero se pueden crear constructores para cualquier orden de carga

 

Deque

La implementacion Deque (pronunciado deck) es una colección de elementos que soporta la insercion y el borrado tanto al principio como al fin.

Esta interfaz esta implementada tanto en LinkedList, como en ArrayDeque y aporta métodos:

  • addFirst() y offerFirst() -Para añadir elementos al inicio
  • addLast() y offerLast-Para añadir elementos al fin
  • removeFirst() y pollFirst() para tomar/borrar de inicio
  • removeLast() y pollLast() para tomar/borrar del final
  • getFirst() y peekFirst() Para examinar desde inicio
  • getLast() y  peekLast() para examinar del final

 

Collection, implementa la interfaz Iterator, que proporciona métodos para recorrer las colecciones sin necesidad de conocer su implementacion. Los métodos previstos por la interfaz son:

Iterator

La interfaz Iterator, implementada por Collection, define los siguientes métodos

  • hasNext(): devuelve true si hay mas elementos en la colección
  • next(): devuelve el siguiente elemento de la colección
  • remove(): Borra el ultimo elemento devuelto por next()

La interface Map

Este artículo sobre colecciones, no se puede considerar completo si no mencionamos la interface Map. Aunque no se pueda considerar una colección como tal, siempre la tenemos que tener en cuenta.

Map es un objeto que facilita enlaces entre claves y valores, lo que seria una “tabla de correspondencia”, cada uno de ellos es colección, y las dos juntas forman el objeto Map. Esta interface define métodos para manejar los elementos  como  put, get, remove, containsKey, containsValue, size, y empty, y operaciones masivas como putAll y clear.

Un objeto implementando Map no puede contener claves iguales.

En Java, la interface Map se implementa en tres clases:

Interface Map en Java

Los comportamientos de estas tres clases son análogos a las correspondientes que implementan Set, pero únicamente para la colección Key,

Dada las especiales características de este objeto, vamos a revisar como podemos ver las colecciones que contiene

  • Map<Integer, String> nombreMap = new HashMap<integer, string=””>();
  • nombreMap.size(); // Devuelve el numero de elementos del Map
  • nombreMap.isEmpty(); // Devuelve true si no hay elementos en el Map y false si si los hay
  • nombreMap.put(K clave, V valor); // Añade un elemento al Map
  • nombreMap.get(K clave); // Devuelve el valor de la clave que se le pasa como parámetro o ‘null’ si la clave no existe
  • nombreMap.clear(); // Borra todos los componentes del Map
  • nombreMap.remove(K clave); // Borra el par clave/valor de la clave que se le pasa como parámetro
  • nombreMap.containsKey(K clave); // Devuelve true si en el map hay una clave que coincide con K
  • nombreMap.containsValue(V valor); // Devuelve true si en el map hay un Valor que coincide con V
  • nombreMap.values(); // Devuelve una “Collection” con los valores del Map
  • keyset() – el Set de claves contenidas en el Map
  • values() – La colección de valores contenidos en el Map. No podemos considerarlo Set, ya que mas de una clave puede apuntar al mismo valor
  • entrySet() – Es un set de parejas de clave-valor

Para recorrer la colección, podríamos hacer:

for (KeyType clave . m.keySet())
    System.out.println(clave);

O con Iterator y while,  obteniendo la clave y el valor :

Iterator it = map.keySet().iterator();
while(it.hasNext()){
  Integer key = it.next();
  System.out.println("Clave: " + key + " -> Valor: " + map.get(key));
}

 

Acerca de Miguel Garcia

Programador, Desarrollador web, Formador en distintas areas de informatica y director de equipos multidisciplinares.
Esta entrada fue publicada en Formacion, Java. Guarda el enlace permanente.

Deja un comentario