# Java Programming/Map

* Navigate Aggregate topic: ( v • d • e )
* Collection
* ArrayList
* Map
* Comparing Objects
Aside from the java.util.Collection interface, the Java JDK has the java.util.Map interface as well. It is sometimes also called an Associated Array or a Dictionary. A map defines key value mappings. Implementations of the Map interface do not contain collections of objects. Instead they contain collections of key->value mappings. It can be thought of as an array where the index doesn't need to be an integer.
* Code section 5.17: Use of a map.
* import java.util.Map;
* import java.util.Hashtable;
* Map map = new Hashtable;
* map.put(key, value);
Use the Map interface if you need to keep related objects together in a Map where you can:
* Access an element by a key object
* Map one object to other

## java.util.Map<K,V>

    maps keys to values. A map cannot contain duplicate keys; each key can map to at most one value. The Map interface provides three collection views, which allow a map's contents to be viewed as a set of keys, collection of values, or set of key-value mappings. The key is usually a non-mutable object. The value object however can be a mutable object.

## java.util.SortedMap<K,V>

    same as the Map interface, plus the keys in the Map are sorted.
In the above example, the same operations are made with two different map implementations:
* Code listing 5.4: MapImplementations.java
* import java.util.LinkedHashMap;
* import java.util.Map;
* import java.util.TreeMap;
* * Compare the map implementations.
* * @author xxx
* public class MapImplementations {
* * Compare the map implementations.
* * @param args The execution parameters.
* public static void main(String args) {
* processMap(new LinkedHashMap<String, Integer>);
* processMap(new TreeMap<String, Integer>);
* * Use a map:
* * 1. Fill the map with key-> value.
* * 2. Print all the keys.
* * @param map The used map.
* public static void processMap(Map<String, Integer> map) {
* System.out.println("Process the map");
* map.put("3", new Integer(3));
* map.put("2", new Integer(2));
* map.put("1", new Integer(1));
* for (String key : map.keySet) {
* System.out.println(key);
* Console for Code listing 5.4
* Process the map
* 3
* 2
* 1
* Process the map
* 1
* 2
* 3
We see that only the TreeMap has sorted the keys. Beware of the generics. The Map interface is tricky. The methods get and remove are not generic. This means that you must be careful of the type of the key:
* Code section 5.18: Tricky generics.
* Map<Integer, String> map = new TreeMap<Integer, String>;
* map.put(new Integer(1), "Watch");
* map.put(new Integer(2), "out");
* map.put(new Integer(3), "!");
* map.remove("2");
* for (String value : map.values) {
* System.out.println(value);
* Console for Code section 5.18
* Watch
* out
The remove call has done nothing because "2" is a String, not an Integer so no key and value has been found and removed.

### Map Classes

The Map interface has the following implementations:

#### java.util.TreeMap<E>

    guarantees that the map will be in ascending key order, sorted according to the natural order for the key's class, not-synchronized.

#### java.util.Hashtable<E>

    Synchronized, null can not be used as key

#### java.util.HashMap<E>

    is roughly equivalent to Hashtable, except that it is unsynchronized and permits nulls

#### java.util.concurrent.ConcurrentHashMap

    same as Hashtable, plus retrieval operations (including get) generally do not block, so may overlap with update operations (including put and remove).

#### java.util.WeakHashMap<E>

    entry in a WeakHashMap will automatically be removed when its key is no longer in ordinary use. Non-synchronized.

#### java.util.LinkedHashMap<E>

    This linked list defines the iteration ordering, which is normally the order in which keys were first inserted into the map (first insertion-order). Note that insertion order is not affected if a key is re-inserted into the map.

#### java.util.IdentityHashMap

    This class implements the Map interface with a hash table, using reference-equality in place of object-equality when comparing keys (and values). In other words, in an IdentityHashMap, two keys k1 and k2 are considered equal if and only if (k1==k2). (In normal Map implementations (like HashMap) two keys k1 and k2 are considered equal if and only if (k1==null ? k2==null : k1.equals(k2)).) Not-synchronized.

#### java.util.EnumMap

    All of the keys in an enum map must come from a single enum type that is specified, explicitly or implicitly, when the map is created. Enum maps are represented internally as arrays. This representation is extremely compact and efficient. Not-synchronized.

## Thread safe maps

The following table lists all the synchronized map classes:
| synchronized | non-synchronized |
| | java.util.TreeMap |
| java.util.Hashtable java.util.concurrent.ConcurrentHashMap | java.util.HashMap |
| | java.util.LinkedHashMap |
| | java.util.IdentityHashMap |
| | java.util.EnumMap |