Titel | Inhalt | Suchen | Index | DOC | Handbuch der Java-Programmierung, 7. Auflage |
<< | < | > | >> | API | Kapitel 16 - Collections II |
Eine Collection des Typs Map realisiert einen assoziativen Speicher, der Schlüssel auf Werte abbildet. Sowohl Schlüssel als auch Werte sind Objekte eines beliebigen Typs. Je Schlüssel gibt es entweder keinen oder genau einen Eintrag in der Collection. Soll ein Schlüssel-Wert-Paar eingefügt werden, dessen Schlüssel bereits existiert, wird dieses nicht neu eingefügt. Es wird lediglich dem vorhandenen Schlüssel der neue Wert zugeordnet. Der Wert wird also praktisch ausgetauscht.
Das Interface Map ist nicht von Collection abgeleitet, sondern eigenständig. Es definiert folgende Methoden:
int size() boolean isEmpty() boolean containsKey(Object key) boolean containsValue(Object value) Object get(Object key) Object put(Object key, Object value) Object remove(Object key) void putAll(Map t) void clear() public Set keySet() public Collection values() public Set entrySet() boolean equals(Object o) int hashCode() |
java.util.Map |
Die Methoden size, isEmpty, remove, clear, equals und hashCode sind mit den gleichnamigen Methoden des Collection-Interface identisch und brauchen daher nicht noch einmal erklärt zu werden.
Mit Hilfe von put wird ein neues Schlüssel-Wert-Paar eingefügt bzw. dem bereits vorhandenen Schlüssel ein neuer Wert zugeordnet. Die Methode putAll macht das für alle Paare der als Argument übergebenen Map. Auch hier gilt die Regel, dass ein Schlüssel, der bereits vorhanden ist, nicht neu eingefügt wird. Lediglich sein zugeordneter Wert wird ausgetauscht. Mit der Methode get kann der Wert zu einem Schlüssel beschafft werden. Da der Rückgabewert vom Typ Object ist, muss er auf den erwarteten Wert gecastet werden.
Falls der angegebene Schlüssel nicht in der Map enthalten ist, wird null zurückgegeben. Hier ist Vorsicht geboten, denn ein null-Wert wird auch dann zurückgegeben, wenn die Map das Einfügen von null-Werten erlaubt und ein solcher diesem Schlüssel explizit zugeordnet wurde. Um diese beiden Fälle zu unterscheiden, kann die Methode containsKey verwendet werden. Sie gibt genau dann true zurück, wenn der gewünschte Schlüssel in der Map enthalten ist. Andernfalls liefert sie false. Analog dazu kann mit containsValue festgestellt werden, ob ein bestimmter Wert mindestens einmal in der Map enthalten ist. |
|
Im Vergleich zum Collection-Interface fällt auf, dass eine Map keine Methode iterator besitzt. Stattdessen kann sie drei unterschiedliche Collections erzeugen, die dann natürlich ihrerseits dazu verwendet werden können, einen Iterator zu liefern. Diese Collections werden als Views, also als Sichten auf die Collection bezeichnet:
Neben den im Interface definierten Methoden sollte eine konkrete Map-Implementierung zwei Konstruktoren zur Verfügung stellen. Ein leerer Konstruktor dient dazu, eine leere Map zu erzeugen. Ein zweiter Konstruktor, der ein einzelnes Map-Argument erwartet, erzeugt eine neue Map mit denselben Schlüssel-Wert-Paaren wie die als Argument übergebene Map.
Das JDK stellt verschiedene Implementierungen des Map-Interface zur Verfügung, beispielsweise:
Weitere Details zur Klasse Hashtable finden sich in Abschnitt 15.4. Dort gibt es auch ein kleines Anwendungsbeispiel, das wir hier in einer für die Klasse HashMap angepassten Form zeigen wollen:
001 /* Listing1604.java */ 002 003 import java.util.*; 004 005 public class Listing1604 006 { 007 public static void main(String[] args) 008 { 009 HashMap h = new HashMap(); 010 011 //Pflege der Aliase 012 h.put("Fritz","f.mueller@test.de"); 013 h.put("Franz","fk@b-blabla.com"); 014 h.put("Paula","user0125@mail.uofm.edu"); 015 h.put("Lissa","lb3@gateway.fhdto.northsurf.dk"); 016 017 //Ausgabe 018 Iterator it = h.entrySet().iterator(); 019 while (it.hasNext()) { 020 Map.Entry entry = (Map.Entry)it.next(); 021 System.out.println( 022 (String)entry.getKey() + " --> " + 023 (String)entry.getValue() 024 ); 025 } 026 } 027 } |
Listing1604.java |
Der wichtigste Unterschied liegt in der Ausgabe der Ergebnisse. Während
bei der Hashtable
eine Enumeration
verwendet wurde, müssen wir hier durch Aufruf von entrySet
zunächst eine Menge der Schlüssel-Wert-Paare beschaffen.
Diese liefert dann einen Iterator, der für jedes Element ein
Objekt des Typs Map.Entry
zurückgibt. Dessen Methoden getKey
und getValue
liefern den Schlüssel bzw. Wert des jeweiligen Eintrags. Alternativ
hätten wir auch mit keySet
die Menge der Schlüssel durchlaufen und mit get
auf den jeweils aktuellen Wert zugreifen können. Dazu müssten
die Zeilen 018 bis 025
im vorigen Listing durch folgenden Code ersetzt werden:
Iterator it = h.keySet().iterator();
while (it.hasNext()) {
String key = (String)it.next();
System.out.println(
key + " --> " + (String)h.get(key)
);
}
Die Ausgabe des Programms unterscheidet sich nur in der Sortierung
von der von Listing 15.3:
Franz --> fk@b-blabla.com
Fritz --> f.mueller@test.de
Paula --> user0125@mail.uofm.edu
Lissa --> lb3@gateway.fhdto.northsurf.dk
Titel | Inhalt | Suchen | Index | DOC | Handbuch der Java-Programmierung, 7. Auflage, Addison Wesley, Version 7.0 |
<< | < | > | >> | API | © 1998, 2011 Guido Krüger & Heiko Hansen, http://www.javabuch.de |