HashMap Fragen

Otz

Bekanntes Mitglied
Hallo zusammen,

ich verwende gerade eine HashMap und dabei sind mir einige Punkte unklar.

1.
Beim einfügen wird ja die Speicherstelle anhand der hashfunktion festgelegt. muss ich diese Hashfunktion von Hand definieren oder gibt es eine default Hashfunktion die man dabei verwenden kann.

2.
Wie ist die Laufzeit beim Lesen von bereits eingefügten Werten einer HashMap?

3.
Kann es sein, dass unterschiedliche Keys auf die selbe Speicherstelle verweisen und somit Kollisionen entstehen? Wie kann dies vermieden werden?


vielen dank
 

rme

Top Contributor
Hallo,

zu 1: Ja, es gibt eine Default-Hashfunktion. Sie nimmt die Adresse des Objekts im virtuellen Speicher als Hash-Wert. Das führt zu unschönen Effekten, wenn man nicht nur Identität, sondern auch Gleichheit abbilden möchte - dann muss es man es selbst machen.

zu 2: Die ist durchschnittlich konstant, weil die aufwändigeren Operationen beim Einfügen gemacht werden. Es kann allerdings selten mal Fälle geben, in denen auch das Finden eines Wertes O(n) benötigt, nämlich wenn es viele Kollisionen gab. Bei einer TreeMap wäre es im schlimmsten Fall O(log n) - dafür ist das Einfügen aber auch entsprechend langsamer. Man muss also sehr genau vorher wissen, was mit der HashMap im Laufe ihres Lebens passiert, um die beste Implementierung zu wählen.

zu 3: Ja, die Kollisionen werden aber durch Sondierung von der Java-Implementierung behandelt - je nach Art der HashMap in einem Baum, einer linearen Liste oder einem Array. Ganz verhindern kannst du es nur, indem du die hashCode-Methode überschreibst und so an deine Klasse anpasst, dass nur bei Gleichheit bzw. Identität der gleiche Hash-Wert entsteht.

Edit: Noch ein paar Dinge ergänzt.
 
Zuletzt bearbeitet:

stg

Top Contributor
Kleine Korrektur: Kollisionen lassen sich nicht komplett vermeiden. Das ist Natur von HashFunktionen, dagegen kannst du nichts machen. Das liegt ganz einfach daran, dass du (praktisch) unbegenzt verschiedene Objekte auf einen relativ kleinen Satz von Schlüsseln (den Wertebereich von von
Code:
int
) abbildest.
Du musst bei der Implementierung von deinen HashFunktionen in erster Linie darauf achten, dass die häufig auftretenden Möglichkeiten gut über den gesamten Wertebereich von Integer verteilt sind. Damit kommt es in der Praxis selten zu Kollisionen, verhindern kannst du sie aber niemals komplett. (Es sei denn es sind weniger als 2^32 verschiedene Ausprägungen möglich, aber dann ist die Frage sowieso recht sinnfei)
 

rme

Top Contributor
Kleine Korrektur: Es gibt heutzutage moderne Verfahren, in denen es keine Kollisionen gibt - perfektes Hashing kombiniert mit Geburtstags-Hashing. Da sind bei amortisierter Analyse alle Operationen in O(1). Das Verfahren ist aber so modern, dass es in Java noch nicht Einzug gehalten hat. Allerdings ist die Implementierung gar nicht so schwer: Kuckucks-Hashing ? Wikipedia

(Kurzfassung: Man nimmt einfach mehrere Hash-Tabellen - wenn es in Tabelle i schon vorhanden ist, speichert man es in Tabelle i +1 usw.)
 
Zuletzt bearbeitet:

stg

Top Contributor
Man kann das natürlich immer weiter austüfteln und verbessern, aber grundsätzlich kann man niemals vollständig Kollisionsfrei hashen. Wenn ich doppelt so viele Leute in einen Zug stecke, wie es Sitzplätze gibt, dann müssen zwangsläufig welche stehen oder auf dem Schoß von Mitreisenden sitzen ;)
Ich spreche da allerdings natürlich von der Theorie. Praktisch kann man vermutlich auf aktuellen Maschinen gar nicht so viele verschiedene Objekte erzeugen, wie es solcherlei verschiedene "Sitzplätze" gibt. Dann ist die Idee vom Kuckucks-Hashing, sofern ich den Artikeln grad richtig aufgefasst habe, einfach eine andere Hashfunktion zu wählen, bis es passt, natürlich klever.
 

rme

Top Contributor
Langsam wird's Off-Topic, aber gut :) Wenn wir in der Theorie von einer Turing-Maschine ausgehen, könnten wir mit einer 2-Band-Maschine kollisionsfrei bleiben - es wird nämlich nur eine neue Hash-Funktion gewählt, sondern auch eine zweite Tabelle. Wenn in der ersten Tabelle beim Einfügen eine Kollision auftritt, wird in der 2. mit einer anderen Hash-Funktion geschaut. Wenn es dort auch eine Kollision gibt, wird die ganze Tabelle mit einer anderen Hash-Funktion neu erzeugt - und das so lange, bis es passt. Das Geburtstags-Paradoxon liefert die nötige Schranke dafür, dass das nicht sehr oft passieren muss. Wenn es keine freien Plätze mehr gibt, wird die Größe der Tabelle verdoppelt. Das klingt natürlich recht langsam - aber es passiert so selten, dass man es mittels amortisierter Analyse in O(1) machen kann.

Da die Bänder der Turing-Maschine unbegrenzt sind, gibt es auch kein Platzproblem oder ein Verlassen des int-Wertebereichts. Also ist es eigentlich eher so, dass das Verfahren in der Theorie perfekt ist, aber in der Praxis durch die Größe int² beschränkt ist.
 
Zuletzt bearbeitet:

Ruzmanz

Top Contributor
Du widersprichst dir selbst, denn die Funktionsweise der Hashfunktion erklärst du richtig. Eine Kollision tritt dann auf, wenn du zwei unterschiedliche "Objekte" unter einem Wert ablegen willst. Und wenn diese Kollision aufgetreten ist, kannst du deinen Wertebereich vergrößern, eine zweite Hashfunktion wählen, usw.

Eine Hash-Funktion bildet per Definition eine größere Menge auf einer kleineren ab. Somit folgt, dass bei einer unendlichen Eingabemenge diese nicht kollisionsfrei abgelegt werden kann. Die große des Speichers spielt dabei keine Rolle. In der Praxis wird er dennoch als Orientierung genutzt, um nicht den kompletten RAM für 10 Objekte belegen zu müssen ...
 

rme

Top Contributor
Gut, dann eben präziser: Kollisionen lassen sich nicht vermeiden, aber die Notwendigkeit einer Sondierung in Datenstrukturen, die beim Suchen nach Werten für eine Verlangsamung sorgen, lässt sich vermeiden.

Ich bezog mich auf Kollisonen innerhalb der Datenstruktur HashMap, nicht der Hash-Funktion selbst. Also das Vorhandensein von doppelten Hash-Werten innerhalb der Struktur. Und das lässt sich wie oben beschrieben vermeiden.
 
Zuletzt bearbeitet:

nvidia

Bekanntes Mitglied
[...] Das Verfahren ist aber so modern, dass es in Java noch nicht Einzug gehalten hat. Allerdings ist die Implementierung gar nicht so schwer: Kuckucks-Hashing ? Wikipedia

Es mag zwar modern sein, jedoch durch die heutige, mehrstufige Speicherarchitektur bedingt, in der Praxis öfter mal langsamer als lineares hashing. Die Artikel dazu kann jeder selbst googlen.

@OT
Allgemein sollte man nicht vergessen das O(x) die obere Grenze ist, es gibt aber noch Omega (untere Beschränkung) und Theta (mittlere Beschränkung) die gerne mal weggelassen werden, für eine objektive Beurteilung aber auch nötig wären. Diese Grenzen sind aber oft wesentlich komplizierter aufzustellen genauso wie die Faktoren. Es ist zwar nett das oft ein O(x) vorgefunden wird, in der Realität aber ein k*O(x) ist und k recht stark variieren kann. Ein Beispiel dafür wäre Heapsort vs. Quicksort, beides n*(log n) wird Heapsort jedoch recht naiv implementiert läuft es langsamer als QS, aber immernoch im Bereich n*(log n).[1]

[1] Auf die Schnelle gesucht, Heapsort, Quicksort, and Entropy
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Java Object to Hashmap ? Java Basics - Anfänger-Themen 6
S HashMap mehrere Keys zu einem Value Java Basics - Anfänger-Themen 3
A Daten aus einer HashMap aus einer DB speichern und mit neuen Werten vergleichen Java Basics - Anfänger-Themen 8
T HashMap Lsite gibt die sachen nicht aus wie gewollt. Java Basics - Anfänger-Themen 3
krgewb HashMap Java Basics - Anfänger-Themen 2
B Hashmap richtig bauen, die Tripel auf Zahl abbildet? Java Basics - Anfänger-Themen 10
"java.util.HashMap.get(Object)" is null Java Basics - Anfänger-Themen 10
berserkerdq2 Hashmap, wie prüfe ich ob ein Key schon existiert Java Basics - Anfänger-Themen 19
S Durch HashMap iterieren Java Basics - Anfänger-Themen 8
rafi072001 Sortieren einer HashMap nach Values Java Basics - Anfänger-Themen 2
F gson mit einer Hashmap Java Basics - Anfänger-Themen 2
J JSON-HashMap Java Basics - Anfänger-Themen 3
J Hashmap Java Basics - Anfänger-Themen 13
C Hashmap zickt Java Basics - Anfänger-Themen 9
S HashMap contains() Methode Java Basics - Anfänger-Themen 1
Z Satz aufteilen und die Wörter zählen (HashMap) Java Basics - Anfänger-Themen 15
N enum Attribut von Objekten einer Hashmap ausgeben Java Basics - Anfänger-Themen 6
P Verschachtelte Hashmap Java Basics - Anfänger-Themen 6
I Sortiert eine HashMap nicht gleich wie eine ArrayList? Java Basics - Anfänger-Themen 1
B HashMap alphabetisch sortieren Java Basics - Anfänger-Themen 2
J HashMap Java Basics - Anfänger-Themen 6
M Enum-Variable HashMap zuweisen Java Basics - Anfänger-Themen 5
U Hashmap Iterator selbst implementieren Java Basics - Anfänger-Themen 10
N HashMap in List good practice? Java Basics - Anfänger-Themen 2
K Value eines HashMaps in einer HashMap wiedergeben. Java Basics - Anfänger-Themen 5
O Hashmap, ArrayList, LinkedList Java Basics - Anfänger-Themen 7
O HashMap - ArrayList Java Basics - Anfänger-Themen 29
J Hashmap langsamer als compareTo? Java Basics - Anfänger-Themen 23
E HashMap+Vererbung Java Basics - Anfänger-Themen 11
J Erhöhen eines Values als Integer bei gleichen Keys in HashMap Java Basics - Anfänger-Themen 12
N Methoden HashMap interne Werte miteinander vergleichen Java Basics - Anfänger-Themen 7
W The type Long is not visible HashMap Java Basics - Anfänger-Themen 4
M Objekt mit Hashmap vergleichen Java Basics - Anfänger-Themen 22
S Gibt es für die Klasse HashMap Generic Implementierungen? Java Basics - Anfänger-Themen 11
C HashMap - alle keys haben values der letzten put-Anweisung Java Basics - Anfänger-Themen 3
J Hashmap auslesen Java Basics - Anfänger-Themen 7
F HashMap sortieren <String, Long> Java Basics - Anfänger-Themen 3
GreenTeaYT HashMap dupliziert meine Elemente? Java Basics - Anfänger-Themen 2
shiroX Methoden Morse-Code Übersetzer mit HashMap Java Basics - Anfänger-Themen 5
E HashMap Problem Java Basics - Anfänger-Themen 5
P Hashmap anstatt LinkedList? Java Basics - Anfänger-Themen 6
T HashMap und die Methoden Java Basics - Anfänger-Themen 13
N Methoden Interaktives PDF mit HashMap befüllen Java Basics - Anfänger-Themen 0
Z Hashmap auseinandernehmen und analysieren Java Basics - Anfänger-Themen 7
B Durchlaufen von Hashmap und Arraylist Java Basics - Anfänger-Themen 8
F HashMap oder welches Array? Java Basics - Anfänger-Themen 4
T HashMap Java Basics - Anfänger-Themen 24
L Hashmap mit variablem Key Java Basics - Anfänger-Themen 9
M Collections Probleme mit Hashmap Java Basics - Anfänger-Themen 4
N Collections String in HashMap umwandeln Java Basics - Anfänger-Themen 3
Z HashMap richtig benutzen Java Basics - Anfänger-Themen 2
lgund HashMap // TS3 Query Java Basics - Anfänger-Themen 7
Z Hashmap Iterator löscht nicht Java Basics - Anfänger-Themen 8
E Hashmap Wert auslesen Java Basics - Anfänger-Themen 2
S Printstream für einen Hashmap Loop Java Basics - Anfänger-Themen 1
dat_vin OOP Hashmap und Attribute Java Basics - Anfänger-Themen 7
C Check ob eine HashMap schon existiert Java Basics - Anfänger-Themen 16
P Vererbung Eigene HashMap Variante Java Basics - Anfänger-Themen 2
R Hashmap in anderer Klasse nicht benutzbar Java Basics - Anfänger-Themen 1
T Java Hashmap Java Basics - Anfänger-Themen 3
L Gibt es etwas wie "HashMap <String, String, String> Java Basics - Anfänger-Themen 9
K HashMap mit Daten aus ArrayList befüllen Java Basics - Anfänger-Themen 14
S OOP Klasse mit static-Eigenschaften - HashMap füllen Java Basics - Anfänger-Themen 6
T HashMap Werte einfügen, durchsuchen und auslesen Java Basics - Anfänger-Themen 17
M Semantisches Problem HashMap/Netzwerk Java Basics - Anfänger-Themen 4
D HashMap Keys durchlaufen Java Basics - Anfänger-Themen 2
B Zugriff auf csv-Datei per hashmap Java Basics - Anfänger-Themen 5
M HashMap keys ausgeben Java Basics - Anfänger-Themen 2
S In einer Hashmap Klassen regestrieren Java Basics - Anfänger-Themen 2
H Collections Was ist schneller - HashMap + Sort v TreeMap? Java Basics - Anfänger-Themen 75
F HashMap nach kleinstem Value durchsuchen Java Basics - Anfänger-Themen 11
G HashMap Java Basics - Anfänger-Themen 6
F Wortpaare - HashMap - ArrayList Java Basics - Anfänger-Themen 6
M HashMap Frage Java Basics - Anfänger-Themen 3
M HashMap - put() reagiert nicht? Java Basics - Anfänger-Themen 8
N Cast eines Objektes in eine Hashmap Java Basics - Anfänger-Themen 13
A CSV Zeilenweise einlesen und in einer HashMap speichern Java Basics - Anfänger-Themen 12
A Input/Output Hashmap in einem JPanel via JList anzeigen Java Basics - Anfänger-Themen 8
K HashMap auf leere Key-Value-Paare prüfen Java Basics - Anfänger-Themen 14
F Hilfe bei der HashMap. Java Basics - Anfänger-Themen 3
F HashMap vs. TreeMap Java Basics - Anfänger-Themen 5
B HashMap Java Basics - Anfänger-Themen 9
C Collections String[] als value in HashMap Java Basics - Anfänger-Themen 6
V Hashmap Iterieren Java Basics - Anfänger-Themen 4
C Csv File in Hashmap ausgeben Java Basics - Anfänger-Themen 14
T HashMap<String,Object> Werte auslesen Java Basics - Anfänger-Themen 5
I HashMap sortieren Java Basics - Anfänger-Themen 10
I HashMap Java Basics - Anfänger-Themen 11
H Collections Brauche modifizierte HashMap Java Basics - Anfänger-Themen 6
H TreeMap/HashMap synchronisieren Java Basics - Anfänger-Themen 2
A Datentypen Hashmap to Array Java Basics - Anfänger-Themen 11
D HashMap überschreibt Werte Java Basics - Anfänger-Themen 7
pg1337 Interface Comparable-Interface bei HashMap Java Basics - Anfänger-Themen 21
D erweiterte hashmap Java Basics - Anfänger-Themen 5
H HashMap<Int, String> - Er findet die Int-Klasse nicht. Java Basics - Anfänger-Themen 3
L HashMap zu JList Java Basics - Anfänger-Themen 6
S Erste Schritte HashMap Kurze Frage - Werte über Schleife ausgeben Java Basics - Anfänger-Themen 30
F Collections ArrayList oder Hashmap mittel Collections.sychronised Java Basics - Anfänger-Themen 6
B Klassen HashMap Zwei Objekte, gleicher Key Java Basics - Anfänger-Themen 4
N HashMap fehlerhafte Rückgabe Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben