Map
Navigate Aggregate topic: ) |
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
Figure 5.6: Map Interfaces.
|
- 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:
|
|
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:
|
|
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
editThe Map interface has the following implementations:
Figure 5.7: Map class diagram.
|
- 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 onlyif (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
editThe 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 |