Mapas+(java.util.Map)

Inicio
En este tema se tratarán todos los conceptos relacionados con los mapas. Se pueden incluir pequeños fragmentos de código para simplificar alguna explicación, nunca un programa completo. Este tema estará abierto hasta el 17 de abril.

¿Qué son?
El interfaz mapa sustituye a la clase Dictionary. Es un interfaz formado por dos objetos: clave y valor. La clave permite acceder al valor.Un Mapa internamente contiene una secuencia de compartimentos denominados //buckets// donde se almacenan todos los valores(clave/valor).Su principal característica es la rapidez realizando búsquedas. En estas agrupaciones denominadas mapas la relación interna existente entre un objeto "clave" es la de designar un único objeto "valor". La relación existente entre estos dos objetos se dice que es tal que la clave mapea un valor, es decir en esa pareja conformada la clave identifica inequívocamente a un objeto. De hecho la correspondencia dentro de un mapa es "sobreyectiva no inyectiva" pues las claves no pueden estar repetidas (no serían claves) y a un valor le puede corresponder una o más claves pero nunca una clave determinará más de un valor dentro de un mapa.

La estructura que utilizamos como mapa es un HashMap, que es una implementación basada en una tabla hash y que por tanto debe implementar equals(Object) y hashCode .El método //hashCode// será utilizado para decidir en qué compartimento almacenar un valor, mientras que el método //equals(Object)// será utilizado para buscar una determinada clave en el Map. También se podrían utilizar LinkedHashMap, que facilita las insercciones y borrados,o TreeMap, el cual define el método subMap que permite recuperar parte del árbol y respeta el orden de las parejas. Los objetos clave de este último deben implementar el interface Comparable. La creación de un objeto seria: Map hm = new HashMap; Para añadir elementos utilizamos el metodo map.put; Si añadimos un nuevo elemento clave/valor cuando la clave ya existe, se sobrescribe el valor almacenado anteriormente.

La principal ventaja de **HashMap**, al igual que ocurre con HashTable es la rapidez con la que efectúa las búsquedas. Además, acepta //null// como clave y como valor. Su implementación se basa en una tabla hash. El objeto que hace la función de clave tiene que redefinir: public int hashCode y public boolean equals(Object). También existe la clase **WeakHashMap**, otra clase que aplica hashtable cuya principal diferencia con **HashMap** es la utilización de //weak keys// o claves débiles, cuya diferenciación es que la entrada en el WeakHashMap será automáticamente eliminada en el momento en el que la llave deje de estar en uso. La clase **LinkedHashMap**, que extiende HashMap permite recorrer los elementos de la colección en el orden en que fueron añadidos mediante una lista doblemente enlazada. Es algo más lenta que HashMap a la hora de añadir los elementos.Unas de las ventajas de esta clase es que a diferencia de HashMap tiene un orden y además ocupa menos memoria que TreeMap. **TreeMap** es la más lenta de las tres a la hora de añadir y acceder a sus elementos. Sin embargo es de gran utilidad, ya que los pares clave-valor se almacenan ordenadamente, ya sea mediante la definición por defecto del método compare o por la que hayamos decidido implementar en la clase de los objetos que estemos ordenando. Además permite recuperar dichas parejas en un orden determinado, ademas es el único que puede recuperar una parte del árbol solamente, mediante la utilización del método subMap. Un ejemplo del TreeMap sería el siguiente: Existe un cuarto tipo de mapas, llamado **SortedMap**. Este tipo permite tener mapas organizados automáticamente por el orden natural de sus claves. Este orden es determinado conforme a la implementación de compareTo. Por ello, todas las claves insertadas en un SortedMap deben implementar el interfaz Comparable. Lo último que hemos dado en clase son excepciones, un ejemplo de estas se muestra cuando se introducen claves o valores no permitidos (según la clase al implementar el interfaz Map), si esto pasa, saltará una excepción que será NullPointerException o ClassCastException.

Relación con Collection
El interfaz Map no proviene de Collection. Este interface, como List y Set, tiene un caracter agrupador; sin embargo, mientras que List y Set heredan del interface Collection, Map no lo hace. Esto es debido a que los Maps además de agrupar dos colecciones de Objetos, "almacenan" referencias o relaciones únicas entre claves y objetos. Esto hace a los Maps ideales para la búsqueda de elementos en su contenido. Por otro lado, se advierte una muy cercana relación entre Lists y Sets con los Maps que se pone de manifiesto en que los Maps pueden devolver una "vista de sus valores" en forma de Collection (ya despojada de sus claves) o una "vista de sus claves" en forma de Collection (ya despojada de sus valores). Incluso puede devolverse una agrupación de claves-valores (dos colecciones) anidadas en un solo interface denominado Map.Entry.

Para recorrer el mapa utilizamos lo que sabemos sobre Collections: Un Iterator será encargado de recorrer los elementos del mapa. Par ello se invocan los métodos map.entrySet y map.iterator. Para mover el iterador utilizaremos el método map.next y si queremos comprobar que el iterador ha llegado al final de la estructura tenemos el método map.hasNext

¿Tienen sentido pudiéndose utilizar relación de objetos?
Sí, tiene sentido. A pesar de que en cierta manera son una variante de relación de objetos (entre 2 elementos unicamente), nos permite combinar la potencia y la relación de las colecciones con la lógica y el análisis de la relación de objetos. No obstante, no debemos olvidar que si queremos relacionar una clave con más de un valor este modelo no nos sirve por lo cual deberíamos emplear la relación de objetos. Esta herramienta se asemeja a lo dado en Búsqueda y Gestión de la Información, en la que las bases de datos estaban formados por una clave única a la cual se le podía relacionar otros atributos, en este caso únicamente podremos relacionarle otro atributo.

¿Que representan las clases Collections y Arrays?
Collection son clases dinámicas que contienen contenedores de objetos.Un Array no es una clase,es decir,no tiene funcionalidad ademas su gestión de memoria es estática. Un mapa es una estrucutra interna de java que permite almacenar valores por pares (clave/valor). Una clave solo tiene un valor asociado de manera que si intentamos añadir otro elemento se sobeescribiría.