Eine HashMap hält ein Array von Buckets. Der Key-Hash wird gespreizt, indem seine höherwertigen Bits eingemischt werden, dann ist der Index dieser Hash maskiert gegen die Tabellenlänge, die immer eine Zweierpotenz ist. Kollisionen bilden eine verkettete Liste im Bucket, und ein Bin mit mindestens acht Einträgen in einer Tabelle mit mindestens vierundsechzig Plätzen wird in einen Rot-Schwarz-Baum umgebaut. Über dem Load Factor von 0,75 verdoppelt sich die Tabelle und die Einträge werden neu gehasht.
Warum Interviewer das fragen
Der Interviewer testet, ob du die Datenstruktur verstehst, die du in jeder Klasse benutzt, statt herunterzubeten, dass sie schnell ist. Treeification und Resize-Details zeigen aktuelles Wissen, denn die Implementierung hat sich in Java 8 geändert. Es führt außerdem direkt dahin, warum Keys immutable sein sollten, warum ein schlechter Hash die Performance ruiniert und warum HashMap bei nebenläufigen Schreibzugriffen unsicher ist.
So baust du deine Antwort auf
- Beschreib das Bucket-Array und wie ein Index abgeleitet wird.
- Erklär die Kollisionsbehandlung und den Wechsel von Liste zu Baum.
- Behandle Load Factor, Resizing und die Kosten des Rehashings.
- Zieh die praktischen Schlüsse zu Key-Design und Thread-Sicherheit.
Beispielantwort
Intern ist das ein Array von Bins. Der hashCode des Keys wird gespreizt, indem die höherwertigen Bits per XOR nach unten gemischt werden, und das ist wichtig, weil der Index einfach der Hash maskiert mit Tabellenlänge minus eins ist, ohne dieses Mischen würden also nur die niederwertigen Bits jemals benutzt. Einträge, die kollidieren, hängen sich in diesem Bin aneinander, und seit Java 8 wird ein Bin, der über acht Einträge wächst, bei einer Tabelle mit mindestens vierundsechzig Plätzen zu einem Rot-Schwarz-Baum, damit das Lookup im schlimmsten Fall logarithmisch statt linear ist. Das war die Antwort auf Denial-of-Service-Angriffe über Hash-Kollisionen. Das Wachstum steuert der Load Factor, bei 0,75 Belegung verdoppelt sich die Tabelle also und alles wird umverteilt, weshalb es sich lohnt, die Map vorab zu dimensionieren, wenn ich weiß, dass eine Million Einträge reinkommen. Die praktischen Konsequenzen, die mich interessieren: Keys sollten immutable sein, ein schlechter hashCode lässt alles in einem einzigen Bin landen, und nebenläufige Schreibzugriffe können die Tabelle zerlegen, geteilte Maps bekommen also eine ConcurrentHashMap statt externem Locking.
Steht dieses Vorstellungsgespräch bald an? GhostPilot hört bei deinem Live-Call mit, erkennt die Frage in dem Moment, in dem sie gestellt wird, und bringt dir eine strukturierte Antwort in Echtzeit auf den Bildschirm. Probier es im nächsten Mock aus, oder hol dir einen $29 Session Pass, kein Abo, für den Ernstfall.
So funktioniert esNachfragen, mit denen du rechnen solltest
- Warum ist die Tabellengröße immer eine Zweierpotenz?
- Was macht ConcurrentHashMap anders, um nebenläufige Schreibzugriffe zu erlauben?
- Wann würdest du LinkedHashMap oder TreeMap bevorzugen?
Weitere Fragen für Java-Entwickler
Dein Interviewer stellt seine eigene Version davon. Kopier deine echte Stellenbeschreibung in den kostenlosen Question Predictor und bekomm die 20 Fragen, die diese Rolle am wahrscheinlichsten stellt, samt dem, worauf jede wirklich abzielt.
Meine Fragen vorhersagen