Какие основные инновации представлены в JDK 21?

«Какие основные инновации представлены в JDK 21?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

JDK 21 — это LTS-релиз, представляющий несколько завершенных и предварительных (preview) функций, меняющих подход к разработке на Java.

1. Виртуальные потоки (Virtual Threads) — JEP 444 (Завершена) Легковесные потоки, управляемые JVM, а не ОС. Позволяют писать синхронный блокирующий код, который масштабируется до миллионов параллельных задач.

// Запуск виртуального потока
Thread.startVirtualThread(() -> {
    String result = downloadFromNetwork(); // Блокирующий вызов
    System.out.println(result);
});
// Использование ExecutorService для виртуальных потоков
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
    IntStream.range(0, 10_000).forEach(i ->
        executor.submit(() -> {
            Thread.sleep(Duration.ofSeconds(1));
            return i;
        })
    );
}

2. Шаблоны записей (Record Patterns) — JEP 440 (Завершена) Декомпозиция записей (records) в шаблонах instanceof и switch.

record Point(int x, int y) {}

// Декомпозиция в instanceof
if (obj instanceof Point(int x, int y)) {
    System.out.println(x + y);
}
// Декомпозиция в switch
switch (shape) {
    case Rectangle(Point(var x1, var y1), Point(var x2, var y2)) -> processRect(x1, y1, x2, y2);
    case Circle(Point center, int radius) -> processCircle(center, radius);
}

3. Упорядоченные коллекции (Sequenced Collections) — JEP 431 (Завершена) Новые интерфейсы (SequencedCollection, SequencedSet, SequencedMap) для коллекций с четким порядком обхода.

SequencedCollection<String> seq = new LinkedHashSet<>();
seq.addFirst("first"); // Добавить в начало
seq.addLast("last");   // Добавить в конец
String first = seq.getFirst(); // Получить первый элемент

4. Шаблоны строк (String Templates) — JEP 430 (Preview) Безопасная интерполяция строк с валидацией и экранированием.

String name = "Alice";
int age = 30;
// STR — шаблонный процессор
String message = STR."Hello, {name}. You are {age} years old.";
// FMT — процессор с форматированием
String formatted = FMT."Value: {value:%.2f}";

5. Поколенный ZGC (Generational ZGC) — JEP 439 (Завершена) Модификация сборщика мусора ZGC, разделяющая объекты на поколения (молодые/старые), что значительно снижает паузы и накладные расходы.

Эти изменения направлены на повышение производительности, масштабируемости и читаемости кода.