Literatur

Maps

Eine Map enthält Objekte in einer strukturierten Form. Diese Datenstruktur wird im Interface java.util.Map beschrieben, welche von den einzelnen Map-Klassen implementiert wird. Eine Map ist wie ein Wörterbuch aufgebaut. Jeder Eintrag besteht aus einem Schlüssel (key) und dem zugehörigen Wert (value). Es können beliebige Objekte hinzugefügt oder entfernt werden.

Jeder Schlüssel darf in einer Map nur genau einmal vorhanden sein, wodurch jedes Schlüssel-Wert-Paar einzigartig ist. Beim Einfügen eines Schlüssel-Wert-Paares in eine Map wird zuvor intern überprüft, ob dieser Schlüssel schon vorhanden ist. Sollte dies der Fall sein, so bleibt die Map nicht wie bei Sets unverändert. Der alte Wert zu dem bereits vorhandenen Schlüssel wird durch den neuen Wert ersetzt.

Schauen wir uns an dieser Stelle eine solche Map in einer Beispiel-Übersicht an.

Schlüssel (key) Wert (value)
12345 Student {Waldfee, Holla, 12345}
12355 Student {Stilzchen, Humpel, 12355}

In der obigen Übersicht kann man in der ersten Spalte den Schlüssel sehen und in der zweiten Spalte den dazugehörigen Wert. Als Schlüssel haben wir hier die Matrikelnummer eines Studenten genommen, da diese eindeutig und niemals doppelt vorhanden ist. Als Wert wäre hier der dazugehörige Student einzutragen.

Eine Map bietet unter anderem folgende Methoden

public V put(K key, V value)
public V remove(Object key)
public Collection values()
public V get(Object key)
public boolean isEmpty()

Die Methode isEmpty prüft, ob die Map leer ist.

Mit den Methoden put und remove werden Elemente der Map hinzugefügt bzw. aus ihr entfernt. Die Methode remove gibt den Wert zum gelöschten Schlüssel zurück und die Methode put den Wert zum Schlüssel des einzufügenden Objektes, falls dieser bereits in der Map vorhanden ist. Falls der Schlüssel noch nicht in der Map existiert, wird null zurückgeliefert.

Über die Methode get erhält man zu einem bestimmten Schlüssel den dazugehörigen Wert.

Die Methode values liefert uns eine Collection mit allen Werten der Map zurück. Änderungen an der Collection wirken sich auf die Map aus und umgekehrt. Auf die Werte kann man dann mittels eines Iterators zugreifen.

Schauen wir uns dazu ein kleines Beispiel einer HashMap (java.util.HashMap) an.

public class Student
{
    // Attribute name und vorname eines Studenten
    String name,vorname;
    // Attribut matrikelnummer (eindeutige Nummer)
    int matrikelnummer;
    // Konstruktor für einen Studenten
    public Student(String name,String vorname,int matrikelnummer)
    {
        this.name = name;
        this.vorname = vorname;
        this.matrikelnummer = matrikelnummer;
    }
    // getter-Methode für die Matrikelnummer
    public int getMatrikelnummer()
    {
        return this.matrikelnummer;
    }
}
 
// Import-Anweisung für unsere HashMap
import java.util.HashMap;
 
public class HashMapTest
{
    // main-Methode
    public static void main(String[] args)
    {
        HashMap map = new HashMap();

        // Drei Objekte der Klasse Student werden erzeugt
        Student st1 = new Student("Topf", "Hans", 12345);
        Student st2 = new Student("Teller", "Hannes", 12323);
        Student st3 = new Student("Besteck", "Maxi", 12345);

        // Einfügen der Objekte in die HashMap
        // Matrikelnummer wird als Key eingetragen 
        map.put(new Integer(st1.getMatrikelnummer()), st1);
        map.put(new Integer(st2.getMatrikelnummer()), st2);

        // Student st1 wird durch st3 ersetzt, da die 
        // Matrikelnummer schon als Schlüssel vergeben ist
        map.put(new Integer(st3.getMatrikelnummer()), st3);
    }
}

Der dritte Aufruf der Methode put führt zu einem Austausch des Studenten-Objekts, da der Schlüssel (hier die Matrikelnummer) schon vorhanden ist. Der alte Wert wird dann zurückgegeben.

Eine weitere Map ist die sogenannte TreeMap. In dieser Map werden Objekte sortiert abgelegt. Alle Klassen die in einer TreeMap als Schlüssel dienen sollen, müssen das Interface Comparable implementieren. Dadurch werden Objekte vergleichbar gemacht, in dem man die Methode compareTo für die eigene Klasse implementiert.

Da wir das Prinzip bei der TreeList schon im Kapitel Sets erklärt haben, verzichten wir an dieser Stelle darauf, da das Prinzip komplett übertragbar ist.