In diesem Post widme ich mich kurz der HashMap und ihren Eigenschaften. Folgende Fragegestellungen werden angesprochen:

      HashMap in Java
      HashMap Beispiel
      Unterschied HashMap zu Hashtable
      Assoziatives Array in Java


Eine HashMap dient zum speichern von Key-Value (Schlüssel-Wert) Paaren. Das heisst man gibt einen Schlüssel an und kann zu diesem Schlüssel einen Wert abspeichern und zu genau diesem Schlüssel auch den Wert wieder aus der HashMap herausholen. Ein Schlüssel kann ein beliebiges Objekt sein und ist meist eine Object Id, Speicheradresse oder ein String. Wichtig ist jedoch, dass ein Schlüssel eindeutig ist, sodass niemals ein Schlüssel für zwei Werte exisitiert.

Technisch funktioniert die HashMap so, dass aus dem Schlüssel ein Hash-Wert berechnet wird der als Adresse in einer Tabelle dient wo der Wert abgespeichert wird. Das berechnen eines solchen Hashs ist nicht immer leicht, aber Java bietet standardmäßig ein recht solides Verfahren für die meisten primitiven Datentypen (die Methode hash() in Object dient genau dazu und wird in String etc. überschrieben). Eine gute Einführung in Hashwerte kann auf der Wikipedia nachgelesen werden.

Im folgenden wird ein kurzes Beispiel eine HashMap gezeigt:

import java.util.*;

public class HashMapDemo {

  public static void main(String[] args) {

    HashMap hm = new HashMap();
    hm.put("Rohit", new Double(3434.34));
    hm.put("Mohit", new Double(123.22));
    hm.put("Ashish", new Double(1200.34));
    hm.put("Khariwal", new Double(99.34));
    hm.put("Pankaj", new Double(-19.34));
   
    for( String name: hm.keySet() )
    {
       System.out.println(name + ": "+ hm.get(name));    
    }

    // Rohit's um 1000 erhoehen
    double balance = ((Double)hm.get("Rohit")).doubleValue();
    hm.put("Rohit", new Double(balance + 1000));

    System.out.println("Rohits neuer Kontostand : " + hm.get("Rohit"));
  }
}

Die Ausgabe ist wie folgt:

Rohit : 3434.34
Ashish : 1200.34
Pankaj : -19.34
Mohit : 123.22
Khariwal : 99.34
Rohit new balance : 4434.34

Der Unteschied zwischen einer HashMap und einer Hashtable ist marginal. Beide bieten die selbe Funktionalität. Der Unterschied ist lediglich, dass Hashtables synchronized sind und daher unter Umständen etwas langsamer sind als HashMaps.

Categories: Java

16 Comments

Rob · February 8, 2011 at 12:36 am

Perfekt, genau was ich gesucht habe, danke Mann 🙂

Alex · March 29, 2011 at 9:53 am

solte diese zeile

System.out.println(name + “: “+ hm.get(name));

nich wiefolgt lauten:

System.out.println(name + “: “+ hm.get(value));
//also + der kontostand

?

Alex · March 29, 2011 at 9:54 am

also eher “balance” wie oben benutzt wurde statt value

    schabby · March 29, 2011 at 10:30 am

    Hi Alex,

    hilf mir bitte kurz auf die Sprünge, was Du genau meinst 🙂 Syntaktisch ist System.out.println(name + “: “+ hm.get(value)); korrekt. Das ‘+’ dient ja in dieser Zeile dazu den String zusammenzusetzen und nicht die Balance zu addieren.

    Hilft Dir das weiter oder habe ich Deine Frage nicht kapiert? 🙂

    Viele Grüße

    Johannes

Basti · April 21, 2011 at 9:22 am

Hi! Danke für diese zusammenfassung! Basti

balibalo · June 17, 2011 at 2:29 pm

@alex:
die get() Methode von HashMap nimmt eine “Schlussel” als Parameter und gibt eine “Wert” zurück.
Hier sind alle Schlussel in ein Set gespeichert durch keySet() und dann für jede Schlussel (die “name” heisst) wird diese Schlussel (name) und ihre Wert (get(name)) gedruckt.

“value” oder “balance” hat damit nix zu tun. Ist es schon klar?

Vin · August 19, 2011 at 3:23 pm

irgendwie ist der Typ-Cast:
((Double)hm.get(“Rohit”)).doubleValue();

sinfrei… oder ttäusch ich mich da?

    schabby · August 22, 2011 at 9:19 am

    Hi,

    ja, Du hast Recht, es ist nicht wirklich nötig. Ich habe gerade folgendes ausprobiert:

    Double d1 = 0.312d;
    double d2 = d1;

    und ja, Java macht natürlich ein automatisches “unboxing” in den primitiven Typ.

    VG, Johannes

Flex · September 11, 2012 at 4:17 pm

Hi,

danke für die Zusammenfassung. Hat mir geholfen! Aber ich habe einen Fehler entedeckt.
Die von Object vorgegebene Funktion für den HashCode heißt nicht hash() sondern hashcode().
(Siehe http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html)

Gruß

Adella · May 15, 2013 at 2:04 pm

Ich bin adella aus dem informatikkurs 🙂

Ernst · November 29, 2013 at 11:44 am

@adella
das war sehr hilfreich 😉

Chris · January 27, 2014 at 5:34 pm

Eine Frage, gibt es einen Trick, wenn ich eine HashMap<Integer, Set> erstelleen möchte, wobei der Integerwert das Alter des Studenten sein soll. Es gibt aber mehrere Studenten, mit demselben Alter. Ich habe zunächst den Namen des Studenten mit in den Integerwert eingerechnet, um eine Eindeutigkeit zu erzielen. nun soll ich aber anhand des Alters auch wieder auf den Satz Studenten zugreifen können. Dies kann ich aber nicht, da ich den dazugehörigen namen ja nicht kenne, also den Integerwert nicht errechnen kann…
Wie kann ich das lösen?

eine Random, oder eine andere Konstante brngt mir hier ja auch nichts…???

Chris · January 27, 2014 at 5:35 pm

HashMap<Integer,Set> !!!

Skunk · February 14, 2014 at 6:39 am

@Adella: Krasser 5hice!

@topic: Sauberes Beispiel 🙂

Mauri · February 16, 2018 at 12:14 pm

Ich bin Mauri aus dem Informatik-Kurs 😛

Anonymous · March 11, 2014 at 1:42 pm

[…] […]

Leave a Reply

Your email address will not be published. Required fields are marked *