Java 19 что нового
Перейти к содержимому

Java 19 что нового

  • автор:

Реліз Java 19: 7 нових JEP та ще багато покращень

Цей день настав! Офіційний реліз JDK 19 вже сьогодні, вже зараз. А це значить, що треба розібратися, що ж в ньому нового.

Java 19 General-Availability

Реліз JDK 19 є десятим за рахунком Feature Release, який було своєчасно випущено в рамках шестимісячної каденції. Такий рівень передбачуваності дозволяє розробникам досягати відносно простого, послідовного та не витратного за часом впровадження інновацій завдяки постійному потоку очікуваних змін.

Ще однією важливою зміною під час релізу Oracle JDK 17 стало введення нових і простіших ліцензійних умов, які дозволять компаніям використовувати Oracle JDK 17, включаючи щоквартальні патчі продуктивності, стабільності та безпеки, безкоштовно протягом щонайменше наступних трьох років, дозволяючи один повний рік перекриття з наступним LTS випуском.

Передплатники Java SE отримують доступ до підтримки Java SE від Oracle та комерційних функцій, таких як GraalVM Enterprise, Java Management Service і Advanced Management Console. Детальніше про нові ліцензійні умови Java SE доступно тут.

Вклад компаній у Java 19

З 19 297 тікетів у JIRA, позначених як виправлені у релізах Java 19 на момент їх General-Availability, 13 825 були завершені людьми, що працюють в Oracle, тоді як 5 472 були внесені індивідуальними розробниками та розробниками, що працюють в інших організаціях:

У Java 19 з 1 962 тікетів у JIRA, позначених як виправлені, 1 383 були завершені Oracle, а 579 були внесені іншими членами спільноти Java.

Що нового у Java 19

JDK Enhancement Papers

Отже, почнемо із глобальних змін, які несуть нові JDK Enhancement Papers (JEP):

  • JEP 405 Record Patterns (Preview)
  • JEP 422 Linux/RISC-V Port
  • JEP 424 Foreign Function & Memory API (Preview)
  • JEP 425 Virtual Threads (Preview)
  • JEP 426 Vector API (Fourth Incubator)
  • JEP 427 Pattern Matching for switch (Third Preview)
  • JEP 428 Structured Concurrency (Incubator)

Нововведення у JDK 19 (по за контекстом JEP):

  • Можливість керування кодуванням STDOUT/STDERR (JDK-8283620)
  • підтримка Unicode 14.0 (JDK-8268081)
  • Реалізація Pointer Authentication Code для AARCH64 (Linux only, JDK-8277204)
  • Автоматична генерація Class-Data-Sharing (CDS) архіву (JDK-8261455)

Повний перелік нововведень доступний у Release Notes. Найцікавіше (нові JEP) ми все ж таки розглянемо.

Project Loom

JEP 425: Virtual Threads

З’явився новий тип Java-потоків — Virtual Thread. На відміну від класичних потоків, віртуальні вже не мають прямого співвідношення до системних потоків. А також їхня кількість більше не залежить від кількості доступних системних потоків, а лише від наявної пам’яті, якою оперує JVM. Новий функціонал буде доступний у форматі preview feature. Конструкції, з якими доведеться мати справу:

Thread.startVirtual( () -> System.out.println(Thread.currentThread()) );
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) < executor.submit(() ->< Thread.sleep(Duration.ofSeconds(1)); >); >

Деталізований розбір доступний тут.

JEP 428: Structured Concurrency

Structured Concurrency вже на стадії інкубатора, новий функціонал спрощує багатопотокове програмування за допомогою структурованого паралелізму. Цей паралелізм розглядає декілька завдань, що виконуються в різних потоках, як єдину робочу одиницю, щоб спростити обробку та скасування помилок:

static Callable task = () -> 
System.out.println(Thread.currentThread());
Thread.sleep(Duration.ofSeconds(1));
return 42;
static void simpleScope() throws InterruptedException 
try(var scope = new StructuredTaskScope<>()) 
var fut = scope.fork(task);
scope.join();
System.out.println(fut.resultNow());

Деталізований розбір доступний тут, тут, тут і тут.

Project Amber

JEP 405: Record pattern matching

Загалом, patter matching використовується для двох задач: встановлення типу, та приведення змінної до певного типу, якщо змінна такою є, наприклад:

Object object = . ; // any object
if (object instanceof String s) 
int length = s.length();
System.out.println("This object is a string of length" + length);
> else 
System.out.println("This object is not a string.");

Що ж стосується рекордів, то тут ситуація може бути наступною:

record Point(int x, int y) <>
var p = (Object) new Point(1, 2);
if (pObject instanceof Point newP) 
System.out.println(newP);

Тобто, працює той самий механізм як і раніше, але тепер є можливість організувати більш гранулярний доступ до атрибутів рекорду:

record Point(int x, int y) <>
var p = (Object) new Point(1, 2);
if (pObject instanceof Point(int x, int y)) 
System.out.printf(“Point[x=%d, y=%d]\n”, x, y);

Повний та детальний опис функціонала доступний у JEP 405.

JEP 427: Patter matching for switch

У Java 16, JEP 394 розширив оператор instanceof для використання у межах pattern matching. Це скромне розширення дозволяє спростити знайому ідіому instanceof та cast :

if (o instanceof String s)

Ми часто бажаємо порівнювати змінну з декількома альтернативами. Java підтримує багатосторонні порівняння з допомогою операторів switch і, починаючи з Java 14, switch expression (JEP 361). Отже, набір гілок if-esle можна переробити на наступну структуру:

static void testFooBar(String s) < switch (s) < case null ->System.out.println("Oops"); case "Foo", "Bar" -> System.out.println("Great"); default -> System.out.println("Ok"); > >

Частіше за все є необхідність визначитися із типом змінної та ії контетом одночасно, тому доводиться робити наступні конструкції:

class Shape <> class Rectangle extends Shape <> class Triangle extends Shape < int calculateArea() < . >> static void testTriangle(Shape s) < switch (s) < case null: break; case Triangle t: if (t.calculateArea() >100) < System.out.println("Large triangle"); break; >default: System.out.println("A shape, possibly a small triangle"); > >

Проблема тут полягає в тому, що використання одного шаблону для розрізнення кейсів не виходить за рамки однієї умови — нам потрібен якийсь спосіб виразити уточнення шаблону. Один з підходів полягає у введенні guarded patterns, які дозволяють уточнити шаблон за допомогою довільного булевого визару:

static void testTriangle(Shape s) < switch (s) < case null -> < break; >case Triangle t when t.calculateArea() > 100 -> System.out.println("Large triangle"); default -> System.out.println("A shape, possibly a small triangle"); > >

Отже, конструкція case . when . -> . дозволяє формувати більш складні кейси із використанням patter matching.

Більше матеріалів по Project Amber можна знайти тут і тут.

Project Panama

JEP 424: Foreign Function & Memory API

Нарешті, повноцінна заміна JNI, яка реалізує Application Binary Interface і дозволяє використовувати C ABI, для роботи з нативними С бібліотеками напряму та через extern C з С++ бібліотеками. Якщо хочете розібратися у цій темі, я дуже рекомендую прочитати мій цикл статей тут на DOU:

  • Вступи до Project Panama (Частина 1)
  • Реалізація варіативних функцій (Частина 2)
  • Кодогенерація JEXTRACT (Частина 3)
  • Керувати off-heap пам’яттю (Частина 4)

Зверніть увагу, що функціонал доступний у форматі preview feature. Щоб працювати з цим API, треба:

  • Скомпілюйте програму за допомогою javac --release 19 --enable-preview Main.java та запустіть її за допомогою java --enable-preview Main .
  • Використовуючи програму запуску вихідного коду, запустіть програму з java --source 19 --enable-preview Main.java .
  • Використовуючи jshell , почніть його з jshell --enable-preview .
  • Додайте відповідний модуль --add-modules jdk.incubator.vector --enable-native-access=ALL-UNNAMED

JEP 426: Vectors API

Функціонал, який поставляється у рамках OpenJDK Project Panama не обмежений лише набором класів для експлуатації C ABI у рамках JVM та новим інструментом кодогенерації — jextract. Дуже важливими нововведеннями для розробників є так звані Vectors API — набір класів, суть котрих полягає в наданні певних можливостей для реалізації векторної алгебри (криптографія, мультимедіа, AI/ML). Отже, ця стаття спрямована на те, щоб на певних прикладах показати, що таке Vectors API, звідки воно походить, та як їх використовувати у Java додатках.

Удосконалення API, запропоновані для JDK 19, включають поліпшення завантаження та зберігання векторів з MemorySegments, як визначено в попередньому перегляді Foreign Function and Memory API. JDK 19 також додасть дві перехресні векторні операції, стиснення та розширення, разом з додатковою операцією стиснення векторних масок. Операція стиснення корисна для фільтрації результатів обробки векторів.

Це вже інкубаторний реліз, який працює на всіх доступних архітектурах процесорів Intel, AMD, ARM. Вже є підтримка нових топових інструкцій типу AVX 512bit і ще багато цікавого. Від себе додам, що стаття про векторні обчислення вже написана та чекає публікації, а поки що можу поділитися результатами бенчмарку роботи AVX 128 біт (спільний знаменник між усіма архітектурами):

RISC-V

Метою проєкту є створення повнофункціонального переносу OpenJDK на платформу Linux/RISC-V, який може бути інтегрований в основну гілку розробки OpenJDK. Наразі планується підтримка порту JDK 19 на Linux на RISC-V. Вже є успішні спроби повноцінно портувати JDK та JVM на RISC-V, цей порт успішно пройшов тести JTREG, що вже означає, що більшість Java застосунків будуть працювати на цій архітектурі без проблем.

Сам проєкт створення порту JVM містить підлаштування C1, C2 JIT-компіляторів, найкращих GC типу ZGC.

Для довідки: RISC-V — це архітектура набору інструкцій з відкритим кодом та безоплатною ліцензією для обчислювальних платформ, починаючи від вбудованих систем, і закінчуючи корпоративними серверами. Наразі певні клаудпровайдери, типу Alibaba, вже пропонуються RISC-V для всіх бажаючих. Проєкт RISC-V просувають такі мастадонти як Google, nVIDIA, Samsung.

Дистрибутив JDK 19

Офіційні джерела

Офіційний реліз Oracle OpenJDK доступний тут — jdk.java.net/19

Офіційні Java action для GitHub

Реліз вже доступний для GitHub Actions:

steps:
- name: 'Set up latest Oracle OpenJDK 19'
uses: oracle-actions/setup-java@v1
with:
website: jdk.java.net
release: 19
steps:
- name: 'Set up latest Oracle JDK 19'
uses: oracle-actions/setup-java@v1
with:
website: java.net
release: 19

Офіційна документація

Ліцензування

Трохи висновків

Java продовжує залишатися мовою програмування № 1 для сучасних технологічних тенденцій. Як показує своєчасне впровадження вдосконалень у Java 19, завдяки постійному ретельному плануванню та залученню екосистеми, платформа Java є добре позиціонованою для сучасного розвитку і зростання в хмарі.

Новий реліз хоч і не є Long-Time-Support версією, але несе дуже важливі зміни у JDK, особливо у два напрями:

  • багато-потоковість
  • авто-векторізація

Отже, цей реліз, та наступні будуть цікаві усім, хто розробляє мережеві додатки, проекти з досить складною математикою типу Tribuo, або інші AI/ML фрейморки, а також ті розробники хто захоче створити ті бібліотеки, яких ще не існує у Java екосистемі.

Слідкуйте за новинами та оновленнями за посиланням:

  • Dev.java (Спеціальний портал Oracle для поглиблення ваших знань з Java та участі у комʼюніті).
  • Inside.java (суто-технічний блог який ведуть архітектори та інженери що розроблюють Java).
  • Inside.java подксат про JDK, JVM, GC, core libs і так далі.
  • Inside.java Newscasts (щотижневе YouTube-шоу, суто про Java).
  • Java on YouTube (все про Java та екосистему).
  • OpenJDK mailing lists (місце, де можна дізнатися поточний стан речей у OpenJDK комʼюніті).
  • Підписуйтесь на OpenJDK and Java on Twitter.

Ну, і підписуйтесь на мене у Twitter. Там я роблю щотижневий #JavaTuesdayThread — про поглиблений функціонал JDK, про C/C++ у контексті Java та ще багато чого іншного.

�� Подобається Сподобалось 5

До обраного В обраному 3

Вышла Java 19

Вышла общедоступная версия Java 19. В этот релиз попало более двух тысяч закрытых задач и 7 JEP'ов. Release Notes можно посмотреть здесь. Изменения API – здесь.

Ссылки на скачивание:

Вот список JEP'ов, которые попали в Java 19

Паттерн-матчинг для switch (Third Preview) (JEP 427)

Паттерн-матчинг для switch , который появился в Java 17 в режиме preview и остался на второе preview в Java 18, всё ещё остаётся в этом статусе. Это первый случай в Java, когда языковой конструкции не хватило двух релизов, чтобы стать стабильной: ранее все конструкции укладывались в два preview.

В этом релизе в паттерн-матчинг было внесено два главных изменения.

Во-первых, охранные паттерны && были заменены на условия when :

// --enable-preview --release 18: switch (obj) < case Integer x && x >0 -> . ; default -> . ; >
// --enable-preview --release 19: switch (obj) < case Integer x when x >0 -> . ; default -> . ; >

О мотивации такого изменения можно прочитать в рассылке проекта Amber.

Во-вторых, было изменено поведение матчинга null . Теперь null матчится только в ветке case null и больше ни в каких других, включая тотальных:

// --enable-preview --release 18: Object obj = null; switch (obj) < case Object x ->. ; // matches because total pattern >
// --enable-preview --release 19: Object obj = null; switch (obj) < case Object x ->. ; // NPE >
// --enable-preview --release 19: Object obj = null; switch (obj) < case null ->. ; // OK case Object x -> . ; >

Про причины такого изменения можно также прочитать в рассылке.

Паттерны записей (Preview) (JEP 405)

Паттерн-матчинг дополнился новым видом паттерна: паттерн записей.

Раньше для паттерн-матчинга записей был доступен только паттерн по типу с дальнейшим ручным извлечением компонентов:

record Point(int x, int y) <> static void printSum(Object o) < if (o instanceof Point p) < int x = p.x(); int y = p.y(); System.out.println(x + y); >>

С паттернами записей код становится существенно компактнее:

static void printSum(Object o) < if (o instanceof Point(int x, int y)) < System.out.println(x + y); >>

Паттерны записей могут быть вложенными:

record Point(int x, int y) <> enum Color < RED, GREEN, BLUE >record ColoredPoint(Point p, Color c) <> static void printCoordinatesAndColor(ColoredPoint cp) < if (cp instanceof ColoredPoint(Point(var x, var y), var c)) < System.out.println("x = " + x); System.out.println("y = " + y); System.out.println("color java">static void printObject(Object obj) < if (obj instanceof Point(var x, var y) p) < System.out.println("point = " + p); System.out.println("x = " + x); System.out.println("y java">static void printObject(Object obj) < switch (obj) < case Point(var x, var y) when x >0 && y > 0 -> System.out.println("Positive point: x = " + x + ", y Point: x = " + x + ", y Other"); > >

Virtual Threads (Preview) (JEP 425)

В Java появились виртуальные потоки в режиме preview.

Виртуальные потоки, в отличие от потоков операционной системы, являются легковесными и могут создаваться в огромном количестве (миллионы экземпляров). Это свойство должно значительно облегчить написание конкурентных программ, поскольку позволит применять простой подход «один запрос – один поток» и не прибегать к более сложному асинхронному программированию. При этом миграция на виртуальные потоки уже существующего кода должна быть максимально простой, потому что виртуальные потоки являются экземплярами существующего класса java.lang.Thread , а значит, большую часть существующего кода не придётся переписывать.

Виртуальные потоки реализованы поверх обычных потоков и существуют только для JVM, но не для операционной системы (отсюда и название «виртуальные»). Поток, на котором в данный момент работает виртуальный поток, называется потоком-носителем. Если потоки платформы полагаются на планировщик операционной системы, то планировщиком для виртуальных потоков является ForkJoinPool . Когда виртуальный поток блокируется на некоторой блокирующей операции, то он размонтируется от своего потока-носителя, что позволяет потоку-носителю примонтировать другой виртуальный поток и продолжить работу. Такой режим работы и малый размер виртуальных потоков позволяет им очень хорошо масштабироваться. Однако на данный момент есть два исключения: synchronized блоки и JNI. При их выполнении виртуальный поток не может быть размонтирован, поскольку он привязан к своему потоку-носителю. Такое ограничение может препятствовать масштабированию. Поэтому при желании максимально использовать потенциал виртуальных потоков рекомендуется избегать synchronized блоки и операции JNI, которые выполняются часто или занимают длительное время.

Для создания виртуальных потоков и работы с ними появилось следующее API:

  • Thread.Builder – билдер потоков. Например, виртуальный поток можно создать путём вызова Thread.ofVirtual().name("name").unstarted(runnable) .
  • Thread.startVirtualThread(Runnable) – создаёт и сразу же запускает виртуальный поток.
  • Thread.isVirtual() – проверяет, является ли поток виртуальным.
  • Executors.newVirtualThreadPerTaskExecutor() – возвращает исполнитель, который создаёт новый виртуальный поток на каждую задачу.

Для виртуальных потоков также добавилась поддержка в дебаггере, JVM TI и Java Flight Recorder.

Виртуальные потоки разрабатываются с 2017 года в рамках проекта Loom.

Structured Concurrency (Incubator) (JEP 428)

Ещё одним результатом работы над проектом Loom стало добавление в Java нового API для Structured Concurrency.

Structured Concurrency – это подход многопоточного программирования, который заимствует принципы из однопоточного структурного программирования. Главная идея такого подхода заключается в следующем: если задача расщепляется на несколько конкурентных подзадач, то эти подзадачи воссоединяются в блоке кода главной задачи. Все подзадачи логически сгруппированы и организованы в иерархию. Каждая подзадача ограничена по времени жизни областью видимости блока кода главной задачи.

В центре нового API класс StructuredTaskScope . Пример использования StructuredTaskScope , где показана задача, которая параллельно запускает две подзадачи и дожидается результата их выполнения:

try (var scope = new StructuredTaskScope.ShutdownOnFailure()) < Futureuser = scope.fork(() -> findUser()); Future order = scope.fork(() -> fetchOrder()); scope.join(); // Join both forks scope.throwIfFailed(); // . and propagate errors return new Response(user.resultNow(), order.resultNow()); >

Может показаться, что в точности аналогичный код можно было бы написать с использованием ExecutorService и submit() , но у StructuredTaskScope есть несколько принципиальных отличий, которые делают код безопаснее:

  • Время жизни всех потоков подзадач ограничено областью видимости блока try-with-resources . Метод close() гарантированно не завершится, пока не завершатся все подзадачи.
  • Если одна из операций findUser() и fetchOrder() завершается ошибкой, то другая операция отменяется автоматически, если ещё не завершена (в случае политики ShutdownOnFailure , возможны другие).
  • Если главный поток прерывается в процессе ожидания join() , то обе операции findUser() и fetchOrder() отменяются.
  • В дампе потоков будет видна иерархия: потоки, выполняющие findUser() и fetchOrder() , будут отображаться как дочерние для главного потока.

Новое API должно облегчить написание многопоточных программ благодаря знакомому структурному подходу. Пока API имеет инкубационный статус, оно будет находиться в модуле jdk.incubator.concurrent и одноимённом пакете.

Foreign Function & Memory API (Preview) (JEP 424)

Foreign Function & Memory API, которое было в инкубационном статусе в Java 17 и Java 18, теперь стало Preview API. Оно находится в пакете java.lang.foreign .

Vector API (Fourth Incubator) (JEP 426)

Векторное API, которое уже было в инкубационном статусе три релиза (Java 16, Java 17, Java 18), продолжает в нём находиться. Пока API не выйдет из инкубационного статуса, оно будет находиться в модуле jdk.incubator.vector .

Linux/RISC-V Port (JEP 422)

JDK теперь официально портирован под архитектуру Linux/RISC-V.

Заключение

Java 19 не является LTS-релизом и будет получать обновления от Oracle только в течение полугода (до марта 2023 года). Однако Azul обещает выпускать обновления Zulu как минимум до марта 2025 года (2.5 года).

Что нового в Java 19

По большому счету в Java 19 ничего действительно кардинального добавлено не было. В основном небольшие изменения. Этим он напоминает релиз Java 12, в котором тоже были лишь небольшие изменения, а всё остальное так и осталось в preview. Так что можно пока отдохнуть и ничего не учить. В окончательном релизе все нововведения, описанные ниже, могут измениться. Лучше ознакомьтесь с моим учебником Java, а ещё лучше с книгой.

Виртуальные потоки

Только в режиме предварительного API. Окончательно ещё не вошли. Виртуальные потоки представляют собой легковесные потоки. В отличие от стандартных потоков ОС их можно создавать в огромном количестве. Потенциально планируется, что сильно переделывать старый код не придётся, так как они тоже будут потомками Thread.

Шаблоны записей

Шаблоны записей тоже пока только preview. Окончательно в релиз не вошли. В принципе, можно пока не изучать.

Что нового в JAVA 19

На официальном сайте Java есть полный список изменений, и он на английском языке. В этой статье мы приведем обзор только самых важных нововведений, их краткую выдержку и покажем примеры.

  • 1 Основные новые функции
  • 2 Обновления
  • 3 Устаревшее
  • 4 Заключение

Основные новые функции

  • Виртуальные потоки (Preview) JEP 425
    В текущей версии все еще остается в статусе предварительного API и отключен по умолчанию.
    Виртуальные потоки (Virtual Threads) — это облегченные потоки, которые значительно упрощают многопоточную разработку с высокой пропускной способностью.
    Стандартные потоки — это оболочки над потоками ОС. Их использование обходится дорого. По этой причине их количество ограничено.
    В свою очередь, виртуальные потоки легковесны и могут создаваться в огромном количестве. Это свойство позволяет применять подход «поток на запрос», увеличивая масштабируемость, не прибегая к асинхронному программированию. Виртуальный поток использует поток ОС только во время выполнения вычислений на ЦП, так как виртуальный поток существует только внутри JVM. Локальные переменные потока носителя недоступны для виртуального потока, и наоборот.
    Оба вида потока являются экземплярами java.lang.Thread. Это значит, что переход на виртуальные потоки не требует большого болезненного рефакторинга старого кода с использованием только платформенных потоков. Разработчики сами могут выбирать какой вид потока использовать. Например, для создания виртуального потока для каждой задачи используется Executors.newVirtualThreadPerTaskExecutor() .
  • Паттерн запись (Preview) JEP 405
    Добавлен паттерн запись. С его помощью код становится лаконичнее.
    Пример:
//Старый вариант: record Pair(int x, int y) <> static void printSum(Object o) < if (o instanceof Pair p) < System.out.println(p.x() + p.y()); >>
//Новый вариант: record Pair(int x, int y) <> static void printSum(Object o) < if (o instanceof Point(int x, int y)) < System.out.println(x + y); >>

Также он поддерживает вложенные типы.
Пример:

record Fio(String firstName, String lastName) <> record Tire(int width, int aspectRatio, int rim) <> enum Color < BLACK, WHITE, YELLOW >record Auto(Tire tire, Color color) <> record Person(Fio fio, Auto auto) <> static void printTireParametersOfPerson(Person person) < if (person instanceof Person(Fio fio, Auto(Tire(int width, int aspectRatio, int rim) tire, Color color) auto)) < String parameters = "Tire: " + width + "/" + aspectRatio + "R" + "rim"; System.out.println(parameters); >>
  • Паттерн сопоставление для switch (Preview) JEP 427
    Паттерн охранник изменен: было && , стало when .
    Для case можно использовать null . Теперь null матчится только там и больше нигде. В остальных случаях будет NPE .
  • API внешних функций и памяти (Preview) JEP 424
    Данный JEP перешел в статус Preview в JDK 19.
  • Вектор API (Fourth Incubator) JEP 426
    По-прежнему находится в инкубационном статусе.

Обновления

  • Поддержка Юникода 14.0.
  • Новые свойства системы для System.out и System.err .
    Добавлены два новых системных свойства stdout.encoding и stderr.encoding . Значение этих системных свойств — это кодировка, используемая стандартным потоком вывода и стандартными потоками ошибок.
  • Поддержка привязки канала HTTPS для Java GSS/Kerberos.
  • Дополнительные форматы даты и времени.
    java.time.format.DateTimeFormatter и java.time.format.DateTimeFormatterBuilder
    Теперь в классах представлены дополнительные форматы даты/времени. Теперь пользователи могут указать свой собственный гибкий стиль с помощью нового метода DateTimeFormatter.ofLocalizedPattern(String requestedTemplate) .
  • Новые методы создания предварительно выделенных HashMaps и HashSet .
    Были введены новые статические фабричные методы, позволяющие создавать HashMap и связанные экземпляры, предварительно выделенные для размещения ожидаемого количества сопоставлений или элементов. После вызова метода HashMap.newHashMap (для LinkedHashMap , WeakHashMap , HashSet и LinkedHashSet существуют аналогичные методы) запрошенное количество сопоставлений может быть добавлено к вновь созданному HashMap без изменения его размера.

Устаревшее

  • java.lang.ThreadGroup.
    Поведение нескольких методов, удаление которых не рекомендовалось в предыдущих выпусках, изменено следующим образом:
    Метод destroy ничего не делает.
    Метод isDestroyed возвращает ложь.
    Методы setDaemon и isDaemon устанавливают/получают статус демона, который ни для чего не используется.
    Методы suspend , resume и stop бросают UnsupportedOperationException .
  • Прекращение поддержки конструкторов классов Locale .
    Новые фабричные методы Locale.of() заменяют устаревшие конструкторы Locale .

Заключение

В Java 19 не появилось критически важных нововведений, из-за которых стоило бы переходить на эту версию. Будем ждать следующие обновления.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *