Jump to content
Wikibooks The Free Textbook Project

Map

From Wikibooks, open books for an open world
The latest reviewed version was checked on 27 March 2023. There is 1 pending change awaiting review.


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.

Example Code section 5.17: Use of a map.
importjava.util.Map;
importjava.util.HashMap;

// ...
Map<String,Integer>m=newHashMap<>();
// ...

Stringkey="This is a string";
intvalue=135;

m.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:

Computer code Code listing 5.4: MapImplementations.java
importjava.util.LinkedHashMap;
importjava.util.Map;
importjava.util.TreeMap;

/**
 * Compare the map implementations.
 *
 * @author xxx
 */
publicclass MapImplementations{

/**
 * Compare the map implementations.
 * @param args The execution parameters.
 */
publicstaticvoidmain(String[]args){
processMap(newLinkedHashMap<String,Integer>());

processMap(newTreeMap<String,Integer>());
}

/**
 * Use a map:
 * 1. Fill the map with key-> value.
 * 2. Print all the keys.
 *
 * @param map The used map.
 */
publicstaticvoidprocessMap(Map<String,Integer>map){
System.out.println("Process the map");
map.put("3",newInteger(3));
map.put("2",newInteger(2));
map.put("1",newInteger(1));

for(Stringkey:map.keySet()){
System.out.println(key);
}
}
}
Standard input or output 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:

Example Code section 5.18: Tricky generics.
Map<Integer,String>map=newTreeMap<Integer,String>();

map.put(newInteger(1),"Watch");
map.put(newInteger(2),"out");
map.put(newInteger(3),"!");

map.remove("2");

for(Stringvalue:map.values()){
System.out.println(value);
}
Standard input or output 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

[edit | edit source ]

The 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 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

[edit | edit source ]

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


[画像:Clipboard]

To do:
Add some exercises like the ones in Variables


AltStyle によって変換されたページ (->オリジナル) /