Fortgeschrittene Java-Features und APIs
Erklären Sie den Zweck des Pakets java.util.concurrent. Nennen Sie einige Schlüsselklassen.
Antwort:
Das Paket java.util.concurrent bietet ein leistungsfähiges Framework für die nebenläufige Programmierung (concurrent programming) in Java. Es bietet Dienstprogramme zur Verwaltung von Threads, Thread-Pools, nebenläufigen Sammlungen (concurrent collections) und Synchronisation. Zu den Schlüsselklassen gehören ExecutorService, Future, Callable, ConcurrentHashMap und CountDownLatch.
Was ist der Unterschied zwischen dem Schlüsselwort synchronized und ReentrantLock?
Antwort:
synchronized ist ein integriertes Sprachschlüsselwort für intrinsische Sperren (intrinsic locking), das gegenseitigen Ausschluss (mutual exclusion) bietet. ReentrantLock ist eine Klasse aus java.util.concurrent.locks, die mehr Flexibilität bietet, wie z. B. faire Sperren (fair locks), zeitgesteuerte Sperrversuche (timed lock attempts) und unterbrechbare Sperrerwerbung (interruptible lock acquisition). ReentrantLock erfordert explizite Aufrufe von lock() und unlock().
Beschreiben Sie das Konzept von CompletableFuture und seine Vorteile gegenüber Future.
Antwort:
CompletableFuture ist eine Erweiterung von Future, die asynchrone Berechnungen und die Verkettung abhängiger Aufgaben ermöglicht. Im Gegensatz zu Future unterstützt es Callbacks, die Kombination mehrerer Futures und die Behandlung von Ausnahmen auf nicht-blockierende Weise. Dies ermöglicht eine ausdrucksstärkere und effizientere asynchrone Programmierung.
Was ist die Java Streams API und was sind ihre Vorteile?
Antwort:
Die Java Streams API, eingeführt in Java 8, bietet einen funktionalen Ansatz zur Verarbeitung von Datensammlungen. Sie ermöglicht deklarative, Pipeline-basierte Operationen wie Filtern, Mappen und Reduzieren. Vorteile sind verbesserte Lesbarkeit, Möglichkeiten zur parallelen Verarbeitung und reduzierter Boilerplate-Code im Vergleich zu herkömmlichen Schleifen.
Erklären Sie den Zweck von Optional in Java 8 und wie es hilft, NullPointerException zu vermeiden.
Antwort:
Optional ist ein Containerobjekt, das einen Nicht-Null-Wert enthalten kann oder auch nicht. Sein Zweck ist es, eine klare Möglichkeit zu bieten, das Fehlen eines Wertes darzustellen, und Entwickler zu zwingen, den Fall, dass ein Wert fehlen könnte, explizit zu behandeln. Dies reduziert die Wahrscheinlichkeit von NullPointerException, indem Null-Prüfungen explizit und verkettbar gemacht werden.
Was ist die try-with-resources-Anweisung und warum ist sie nützlich?
Antwort:
Die try-with-resources-Anweisung, eingeführt in Java 7, schließt Ressourcen, die AutoCloseable implementieren, am Ende des try-Blocks automatisch. Sie vereinfacht die Ressourcenverwaltung, indem sie die Notwendigkeit expliziter finally-Blöcke zum Schließen von Ressourcen eliminiert und den Code sauberer und weniger anfällig für Ressourcenlecks macht.
Erklären Sie kurz das Konzept von VarHandle und seine Anwendungsfälle.
Antwort:
VarHandle, eingeführt in Java 9, bietet eine standardisierte Möglichkeit, auf Variablen (Felder, Array-Elemente, statische Felder) mit verschiedenen Speicherordnungsschemata (memory ordering semantics) zuzugreifen. Es ist eine Low-Level-API, die hauptsächlich von Bibliotheksentwicklern für hochgradig nebenläufige Datenstrukturen verwendet wird und eine feingranulare Kontrolle über Speicher-Sichtbarkeit und Atomarität bietet, wobei sie Unsafe für viele Operationen ersetzt.
Was sind Records in Java und welches Problem lösen sie?
Antwort:
Records, eingeführt in Java 16, sind ein neuer Klassentyp, der zur Modellierung von unveränderlichen Datenaggregaten entwickelt wurde. Sie generieren automatisch Boilerplate-Code für Konstruktoren, Accessoren, equals(), hashCode() und toString(). Records lösen das Problem des wortreichen Boilerplate-Codes für einfache Datenträger und machen den Code prägnanter und lesbarer.
Wie verbessern Sealed Classes die Typsicherheit und Ausdrucksstärke?
Antwort:
Sealed Classes, eingeführt in Java 17, beschränken, welche anderen Klassen oder Interfaces sie erweitern oder implementieren können. Sie ermöglichen es Entwicklern, explizit eine endliche Menge erlaubter Unterklassen zu deklarieren, was die Typsicherheit verbessert, indem es erschöpfende switch-Anweisungen ermöglicht, und die Ausdrucksstärke erhöht, indem die Hierarchie klar definiert wird.
Was ist der Zweck der HttpClient API in Java 11?
Antwort:
Die HttpClient API, standardisiert in Java 11, bietet eine moderne, nicht-blockierende und hochperformante Möglichkeit, HTTP-Anfragen zu senden und Antworten zu empfangen. Sie unterstützt HTTP/2 und WebSockets "out-of-the-box" und bietet eine flexiblere und effizientere Alternative zu älteren APIs wie HttpURLConnection.