P
prepair.app
Interview starten →
EnglishУкраїнськаРусскийDeutsch

Java-Backend-Interviewfragen

Java-Backend-Interviews drehen sich um die Kernsemantik der Sprache, Collections, Nebenläufigkeit, Spring und dein Verständnis der JVM. Die folgenden Fragen werden am häufigsten gestellt, jeweils mit einer Musterantwort.

Junior · keine Erfahrung / unter 1 JahrMiddle · 2–4 Jahre ErfahrungSenior · 5+ Jahre Erfahrung

Worum es geht

Core Java und OOP
Collections Framework
Nebenläufigkeit und Threads
Spring Boot und Spring Data
JVM, GC und Speicher
SQL und Hibernate

12 echte Fragen mit Antworten

Zu jeder Frage gibt es eine Musterantwort, mit der du deine eigene vergleichen kannst.

1

Wie funktioniert HashMap intern, und worin unterscheidet sich ConcurrentHashMap?

Antwort

HashMap speichert Einträge in einem Array von Buckets, deren Index sich aus dem Hash des Keys ergibt; Kollisionen bilden zunächst eine verkettete Liste, die ab acht Knoten in einen Rot-Schwarz-Baum umgewandelt wird. Sie ist nicht thread-safe — ein gleichzeitiges Resizing kann die Struktur beschädigen. ConcurrentHashMap erreicht Thread-Sicherheit, indem nur der Bucket gesperrt wird, in den gerade geschrieben wird (CAS plus synchronized auf dem Knoten), statt der gesamten Map, sodass Lesezugriffe lock-free bleiben und Schreibzugriffe nur innerhalb desselben Buckets konkurrieren.

2

Erkläre den equals()- und hashCode()-Vertrag. Was bricht, wenn man ihn verletzt?

Antwort

Sind zwei Objekte laut equals() gleich, müssen sie denselben hashCode liefern; ungleiche Objekte dürfen sich einen Hash teilen, sollten es idealerweise aber nicht. Eine Verletzung bricht jede hashbasierte Collection: Ein Objekt landet beim Einfügen in einem Bucket, eine spätere Suche berechnet aber einen anderen Hash, durchsucht einen anderen Bucket und meldet den Eintrag als nicht vorhanden. Der klassische Bug ist, ein Feld zu ändern, das in hashCode einfließt, nachdem das Objekt bereits in ein Set eingefügt wurde.

3

Was ist Garbage Collection, und welche Collectoren bietet die JVM?

Antwort

GC gibt Heap-Speicher für Objekte frei, die von den GC-Roots aus nicht mehr erreichbar sind. Der Heap ist generationell aufgeteilt — die meisten Objekte sterben jung, weshalb Minor-Collections in der Young Generation günstig sind. Zu den Collectoren gehören Serial und Parallel für Durchsatz, G1 als moderner Standard mit ausgewogenem Verhältnis von Pausenzeit und Durchsatz sowie ZGC und Shenandoah für sehr große Heaps mit Pausen im Sub-Millisekunden-Bereich.

4

Was ist der Unterschied zwischen checked und unchecked Exceptions?

Antwort

Checked Exceptions erben von Exception und müssen deklariert oder behandelt werden — sie stehen für Fehlerfälle, mit denen der Aufrufer rechnen sollte, etwa IOException. Unchecked Exceptions erben von RuntimeException und signalisieren Programmierfehler wie NullPointerException oder IllegalArgumentException. In der Praxis gilt: unchecked für Bugs, checked nur sparsam einsetzen, weil das Erzwingen einer Behandlung bei jedem Aufrufer oft zu leeren catch-Blöcken führt.

5

Was ist Dependency Injection in Spring, und welche Injektionsarten gibt es?

Antwort

Bei DI bekommt ein Objekt seine Abhängigkeiten vom Container geliefert, statt sie selbst zu erzeugen, was Klassen entkoppelt und testbar macht. Spring unterstützt Constructor-, Setter- und Field-Injection. Bevorzugt wird die Constructor-Injection: Abhängigkeiten werden final, das Objekt existiert nie in einem halb aufgebauten Zustand, und die Klasse kann eine wachsende Abhängigkeitsliste nicht so leicht verstecken wie bei Field-Injection.

6

Was unterscheidet @Component, @Service, @Repository und @Controller?

Antwort

Alle vier registrieren die Klasse als Spring-Bean und sind für das Scanning technisch austauschbar. Sie unterscheiden sich in der Absicht und in dem, was Spring zusätzlich anhängt: @Repository übersetzt Persistenz-Exceptions in die DataAccessException-Hierarchie von Spring, @Controller und @RestController nehmen am Request-Mapping teil, und @Service ist eine semantische Markierung für Business-Logik. Die spezifische Annotation zu verwenden dokumentiert die Schicht und aktiviert das passende Verhalten.

7

Was ist eine Transaktion? Erkläre die Isolationsebenen.

Antwort

Eine Transaktion ist eine Arbeitseinheit, die ACID erfüllt: Sie wird entweder vollständig committet oder komplett zurückgerollt. Isolationsebenen tauschen Konsistenz gegen Nebenläufigkeit: Read Uncommitted erlaubt Dirty Reads, Read Committed verhindert sie, Repeatable Read verhindert zusätzlich Non-Repeatable Reads, und Serializable verhindert auch Phantom Reads, allerdings auf Kosten des Durchsatzes. Die meisten Systeme laufen auf Read Committed und fangen verbleibende Anomalien mit optimistischem Locking ab.

8

Was ist der Unterschied zwischen ArrayList und LinkedList? Wann nutzt man welche?

Antwort

ArrayList basiert auf einem größenveränderlichen Array: Der Zugriff per Index ist O(1), aber Einfügen oder Entfernen in der Mitte verschiebt Elemente. LinkedList ist eine doppelt verkettete Liste: Einfügen und Entfernen an einem bekannten Knoten ist O(1), der indizierte Zugriff dagegen O(n), und jedes Element trägt zusätzlichen Knoten-Overhead. In der Praxis gewinnt fast immer ArrayList, weil Cache-Lokalität die theoretische Komplexität schlägt; LinkedList ist vor allem als Deque sinnvoll.

9

Was sind volatile und synchronized? Wann verwendet man welches?

Antwort

volatile garantiert Sichtbarkeit — ein Schreibvorgang wird sofort für andere Threads sichtbar, und Lesezugriffe werden nie zwischengespeichert —, garantiert aber keine Atomarität, weshalb ein volatile-Zähler trotzdem Inkremente verlieren kann. synchronized bietet sowohl Sichtbarkeit als auch gegenseitigen Ausschluss, sodass immer nur ein Thread den Block ausführt. volatile eignet sich für ein einfaches Flag, das viele Threads lesen, synchronized oder eine Atomic-Klasse für Operationen, die aus Lesen-Ändern-Schreiben bestehen.

10

Erkläre das N+1-Problem in Hibernate und wie man es vermeidet.

Antwort

N+1 entsteht, wenn man mit einer Query N Parent-Entities lädt und anschließend bei jeder lazy auf eine Collection zugreift, was N zusätzliche Queries erzeugt. In der Praxis fällt das als Seite auf, die in Tests mit drei Zeilen schnell ist und bei dreitausend unbrauchbar wird. Die Lösung ist ein JOIN FETCH in JPQL, ein Entity Graph, Batch-Fetching über @BatchSize oder eine Projektion, die genau die Felder selektiert, die die View braucht.

11

Was ist der Unterschied zwischen String, StringBuilder und StringBuffer?

Antwort

String ist immutable, daher erzeugt jede Konkatenation ein neues Objekt — einen String in einer Schleife mit + zusammenzubauen ist quadratisch. StringBuilder ist ein veränderlicher Puffer und das richtige Werkzeug für genau diese Schleife. StringBuffer ist im Grunde dasselbe wie StringBuilder, nur mit synchronized-Methoden; es ist praktisch Legacy, weil man selten einen veränderlichen Puffer über Threads hinweg teilt und dafür ohnehin meist gröberes Locking braucht.

12

Was ist die Java Stream API, und wann sollte man sie nicht verwenden?

Antwort

Streams drücken Operationen auf Collections deklarativ aus, als Pipeline aus lazy intermediate Operations und einer terminal Operation, die die Ausführung anstößt. Sie eignen sich hervorragend zum Filtern, Mappen und Aggregieren, weil die Absicht lesbar bleibt. Man sollte sie in sehr heißen Schleifen vermeiden, in denen die Abstraktion messbar Zeit kostet, bei Logik mit Seiteneffekten und überall dort, wo eine einfache for-Schleife klarer wäre.

🦎

Antworten lesen reicht nicht

Im echten Interview sprichst du unter Druck. Cam stellt genau diese Fragen, bewertet jede Antwort und zeigt dir genau, was du verbessern musst.

Java Backend-Interview üben →
Kostenlos · 3 Interviews im Monat

Lesenswert

Alle Artikel →

Weitere Spezialisierungen

🔍QA Manual🤖QA Automation🐍Python Backend🐘PHP-Backend🦫Go-Backend🟢Node.js-Backend💎Ruby on Rails🔷C++🟨JavaScript⚛️React Frontend💚Vue Frontend🅰️Angular FrontendNext.js🍏iOS (Swift)🟩Android (Kotlin)⚙️DevOps / SRE🗄️Data Engineer📈Business Analyst🎯Product Manager📋Project Manager🎨UI/UX Designer📣Marketing