Map
Aunque las estructura de datos Map
no forma parte dentro de la jerarquía de la interfaz Collection
, se considera una interfaz de colección principal de Java Collections Framework.
Un Map
es un objeto que asigna claves a valores. Un mapa no puede contener claves duplicadas: cada clave puede asignarse a un valor como máximo. Sin embargo, los valores asignados a la clave pueden tener valores duplicados. La interfaz Map
incluye métodos para operaciones básicas (como put, get, remove, containsKey, containsValue, size, y empty) entre muchos otros.
La plataforma Java contiene tres implementaciones de Map
: HashMap
, TreeMap
y LinkedHashMap
.
Crear un Mapa
Para crear un objeto Map
podemos usar cualquiera de las implementaciones para esta interfaz (HashMap
, TreeMap
y LinkedHashMap
), por ejemplo:
Map<String, String> idiomas = new HashMap<>();
Añadir claves y valores en un mapa
Para añadir un par de clave-valor al mapa usamos el método put
:
public class MainMap {
public static void main(String[] args) {
Map<String, String> idiomas = new HashMap<>();
idiomas.put("es", "Español");
idiomas.put("en", "English EEUU");
idiomas.put("ca", "English Canadá");
idiomas.put("de", "Aleman");
idiomas.put("fr", "Francés");
idiomas.put("it", "Italian");
}
}
Las claves de los mapas son únicas, si intentamos añadir un nuevo valor para una clave que ya existe, el valor es sobreescrito.
Para saber si estamos agregando una nueva clave o solo modificando el valor, el método put
nos ayuda, ya que devuelve el valor anterior asociado con la clave, o null
si no hubo asignación para la clave antes.
Ejemplo:
Map<String, String> idiomas = new HashMap<>();
idiomas.put("es", "Español");
idiomas.put("en", "English EEUU");
idiomas.put("ca", "English Canadá");
idiomas.put("de", "Aleman");
idiomas.put("fr", "Francés");
System.out.println(idiomas.put("it", "Italian")); //devuelve null
System.out.println(idiomas.put("it", "Italiano")); //devuelve el valor previo "Italian", lo que significa que se ha sobreescrito
Obtener el valor para una clave
Para obtener el valor asociado a una clave usamos el método get
:
String valor = idiomas.get("it");
Comprobar si una clave o valor existe
if (idiomas.containsKey("es")) {
System.out.println("La clave es ya existe");
}
if (idiomas.containsValue("Español")) {
System.out.println("El idioma español ya existe");
}
Imprimir todos los valores del Map
Lo haremos de la siguiente forma:
for(String key: idiomas.keySet()) {
System.out.println(key + " " + idiomas.get(key));
}
Al imprimir vemos que las claves no aparecen en ningún orden, ni en el que las hemos introducido ni en orden alfabético. Los elementos del HashMap
no están ordenados.
Imprimir cada una de las entradas del mapa
Si queremos recorrer las entradas del mapa usaremos:
for (Map.Entry<String, String> entradaMapa: idiomas.entrySet()) {
System.out.println(entradaMapa.getKey() + " " + entradaMapa.getValue());
}
Eliminar una entrada clave-valor de un Map
Tenemos dos formas de eliminar:
- Eliminar desde una clave existente, o
- Eliminar un par clave-valor existente.
//Forma 1
boolean eliminado = idiomas.remove("fr");
//Forma 2
if (idiomas.remove("de", "Ingles")) {
System.out.println("de ha sido eliminado");
} else {
System.out.println("No existe un par clave-valor con de-Ingles");
}
Reemplazar el valor de una clave
idiomas.replace("es", "Spain");
idiomas.replace("en", "English", "English EEUU");//Reemplazo el antiguo valor por el nuevo, pero antes me aseguro que el antiguo valor sea ese dato antes de cambiarlo
HashMap
HashMap
es una estructura de datos que implementa la Map<Key,Value>
interfaz y se basa en el principio de hash.
Una función hash es una función que convierte datos de entrada de cualquier tamaño (generalmente grande) en datos de tamaño fijo, generalmente compactos. El resultado de esta función de trabajo se llama código hash.
Cada objeto Java tiene un código hash. Suele ser un número y se calcula utilizando el método hashCode de la clase Object.