Interviewfrage für Java-Entwickler

Erklär, wie HashMap intern funktioniert, inklusive dem, was passiert, wenn sie voll wird.

Worauf der Interviewer abzielt, wie du deine Antwort aufbaust und ein gesprochenes Beispiel zum Anpassen.

Kurzantwort

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

Gesprochenes Beispiel, erste Person

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 es

Nachfragen, 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

Üb die harten Fragen, bevor sie gestellt werden

Trainier mit einem Live-Copiloten und geh dann vorbereitet rein. Ein $29 Session Pass bringt dich durch das Vorstellungsgespräch, ohne Abo und ohne Bindung.

GhostPilot holen