Последнее обновление: 29.09.2020, включающее изменения до JDK 15 .
С момента выпуска версии 8 до версии 15 Java формируется 163 предложениями по расширению JDK (JEP), каждое из которых вносит некоторые улучшения в платформу. Эта страница представляет собой систематизированный и тщательно подобранный список наиболее важных улучшений.
Содержание
Новые языковые функции
Новые API
Улучшения производительности
Улучшения безопасности
Изменения байт-кода
Запуск
Упаковка
Javadoc
Новые платформы
Прекращение поддержки и удаление
Схема новой версии
Полный список JEP можно найти на веб-сайте OpenJDK в проектах jdk и jdk9 .
Все функции обычно доступны и включены по умолчанию, за исключением случаев, когда они помечены одним из следующих значений:
Предварительный просмотр функции полностью определены и реализованы, но еще не считаются окончательными. Они считаются почти завершенными, ожидая дополнительного раунда реальных отзывов. Они должны быть явно включены .
Экспериментальные функции менее стабильны и с большей вероятностью изменятся. Они также должны быть явно включены.
Модули инкубатора не являются финальными инструментами и API и распределены в отдельных модулях .
Новые языковые функции
Когда в Java 8 появились лямбды, это было довольно значительным изменением. Хотя последние версии не добавляли таких впечатляющих функций, в язык было внесено множество небольших улучшений.
Вот краткий обзор того, что произошло за последние годы. Более подробное руководство см. В разделе Новые возможности языка, начиная с Java 8 .
Текстовые блоки
JDK 15 (предварительная версия в JDK 14 и JDK 13 )
String html = """ <html> <body> <p>Hello, world</p> </body> </html> """;
Запечатанные (Sealed) классы могут ограничивать, какие другие классы могут их расширять ( предварительная версия )
public abstract sealed class Shape permits Circle, Rectangle {...} public class Circle extends Shape {...} // OK public class Rectangle extends Shape {...} // OK public class Triangle extends Shape {...} // Compile error // No need for default case if all permitted types are covered double area = switch (shape) { case Circle c -> Math.pow(c.radius(), 2) * Math.PI case Rectangle r -> r.a() * r.b() };
Записи (Records Превью)
record Point(int x, int y) { }
Сопоставление с образцом для instanceof (Предварительный просмотр)
if (obj instanceof String s) { System.out.println("obj is a String and it' length is " + s.length()); }
Выражение Switch
JDK 14 (предварительная версия в JDK 12 и JDK 13)
int numLetters = switch (day) { case MONDAY, FRIDAY, SUNDAY -> 6; case TUESDAY -> 7; default -> { String s = day.toString(); int result = s.length(); yield result; } };
Полезные исключения NullPointerExceptions, точно описывающие, какая переменная была null
JDK 15 (Включено
-XX:+ShowCodeDetailsInExceptionMessages
в JDK 14 )a.b.c.i = 99; --- Exception in thread "main" java.lang.NullPointerException: Cannot read field "c" because "a.b" is null
Введение
var,
позволяющее сделать объявления локальных переменных менее церемоннымиJDK 11 (без поддержки лямбда в JDK 10 )
var greeting = "Hello World!";
Подключаемая и обратно совместимая модульная система, позволяющая избежать исключения
ClassDefNotFoundErrors
во время выполнения и создавать внутренние APIJDK 9 (Project Jigsaw)
module hu.advancedweb.helloworld { requires hu.advancedweb.somedependency; exports hu.advancedweb.hello }
Частные методы в интерфейсах
JDK 9 (Проект Milling Coin)Оператор Diamond для анонимных внутренних классов
JDK 9 (Проект Milling Coin)Try-with-resources, позволяющая эффективно использовать final переменные
JDK 9 (Проект Milling Coin)@SafeVargs
в private методах экземпляра
JDK 9 (Проект Milling Coin)Нет предупреждений об устаревании для
import
операторов
JDK 9
Новые API
Давайте продолжим со Стандартной библиотекой Java, сосредоточив внимание на новых функциях, которые мы можем использовать в повседневном кодировании.
Если вам интересно узнать обо всех различиях уровней API между Java 8 и 14, посмотрите AdoptOpenJDK / jdk-api-diff на GitHub .
Общее
Поддержка неизменяемых сопоставленный с памятью байтовых буферов (Non-Volatile Mapped Byte Buffers) в API-интерфейсе FileChannel
JDK 14Files.mismatch
: найти первый несовпадающий байт в содержимом двух файлов
JDK 12Collectors.teeing
для создания коллектора, который представляет собой смесь двух нижележащих сборщиков
JDK 12Улучшения строк: методы
indent
иtransform
JDK 12Стандартный HTTP-клиент с поддержкой HTTP/2, WebSocket и неблокирующим API
HttpClient httpClient = HttpClient.newBuilder().build(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://advancedweb.hu/")) .GET() .build(); HttpResponse<String> response = httpClient.send(request, BodyHandlers.ofString());
Усовершенствования строк - методы:
isBlank
,lines
,repeat
иstrip
JDK 11Удобные фабричные методы (Factory Methods) для коллекций, решающие проблему отсутствия литералов коллекции
Set<Integer> mySet = Set.of(1, 2, 3); List<Integer> myList = List.of(1, 2, 3); Map<String, Integer> myMap = Map.of("one", 1, "two", 2);
Фреймвок Reactive Streams, релизующий шаблок публикации-подписки для обработки асинхронных потоков с неблокирующим «обратным потоком» (backpressure)1
JDK 9Связанные со временем улучшения
CompletableFuture
(тайм-аут, задержка)
JDK 9Больше возможностей для преобразования (
dropWhile
,takeWhile
) и генерации (iterate
,ofNullable
) потоков; сборщики только для чтения (toUnmodifiableList
); опции могут быть преобразованы в потоки
JDK 9Arrays.mismatch
: найти первый несовпадающий элемент между двумя массивами
JDK 9Stack-Walking API, который позволяет использовать ленивый подход и фильтрацию кадров
JDK 9API процессов предоставляет дополнительную информацию и контроль (например, идентификатор процесса, аргументы, время ЦП, родительские / дочерние процессы), а также улучшения
ProcessBuilder
помогающие создавать конвейеры процессов
JDK 9VarHandle
API для замены операций, связанных с полями и массивами,java.util.concurrent.atomic
иsun.misc.Unsafe
для обеспечения низкоуровневых механизмов доступа, например, атомарной записи.
JDK 9Новые комбинаторы (combinators) и методы поиска (lookup) для
MethodHandle
JDK 9Расширенная политика устаревания.
@Deprecated
может быть отмечен значкомforRemoval
, который выдает новое предупреждение.
JDK 9OASIS Standard XML Catalog API для безопасного и производительного управления внешними ресурсами в XML
JDK 9В JDK обновлен XML парсер Xerces до версии 2.11.0
JDK 9Поддержка TIFF для Image I/O Framework
Интернационализация
В Unicode 10.0, добавление примерно 27000 символов, 10 блоков и более 30 скриптов
JDK 11 (поддержка Unicode 8.0 в JDK 9 )java.util.Locale
и связанные API поддерживают тип валюты, часовой пояс и многое другое.
JDK 10ResourceBundle
загружает файлы свойств в UTF-8 вместо ISO-8859-1
JDK 9Данные CLDR (Common Locale Data Repository) включены по умолчанию
JDK 9
Графика и настольные приложения
Функции рабочего стола для всех платформ, такие как прослушиватель событий входа/вывода/блокировки и взаимодействие с панелью задач
JDK 9MultiResolutionImage
который упрощает получение изображения с определенным разрешением для DPI
JDK 9Графика HiDPI в Windows и Linux
JDK 9Включение GTK 3 в Linux для JavaFX, Swing и AWT
JDK 9Замена тегов Javadoc
@beaninfo
и@BeanInfo
аннотациями для Swing
JDK 9Обновление GStreamer, включенннное в JavaFX / Media, до версии 1.4.4
JDK 9Замена существующего механизм компоновки шрифтов ICU OpenType на HarfBuzz
JDK 9
Улучшения производительности
Общее
API доступа к внешней памяти для безопасного и эффективного использования памяти вне кучи ( инкубатор )
JDK 15 JDK 14Включение динамическое архивирование классов в конце выполнения Java-приложения
JDK 13Совместное использование данных классов приложений для сокращения времени запуска и уменьшения занимаемой памяти за счет обмена метаданными классов между процессами Java.
JDK 10Архив с совместным использованием данных классов для списка классов по умолчанию включен по умолчанию, чтобы сократить время запуска "из коробки"
JDK 12Компактные строки с уменьшеннным размером, более эффективно хранящие строки для Latin-1
JDK 9Кеши кода профилированного и непрофилированного скомпилированного кода разделены, что приводит к повышению производительности и уменьшению объема памяти
JDK 9Хранение задержанных (Interned) строк в архивах совместного использования данных классов для уменьшения потребления памяти
JDK 9
Библиотека
Улучшенные встроенные функции для
java.lang.Math
sin
,cos
иlog
функции на процессорах AArch64
JDK 11Улучшения производительности Security Manager
JDK 9Spin-Wait Hint (
Thread#onSpinWait
) для оптимизации циклов в стиле «занято-ожидание»
JDK 9Использование Marlin Renderer в Java 2D в качестве растеризатора графики по умолчанию вместо Pisces
JDK 9Повышена производительность GHASH и RSA за счет использования недавно представленных инструкций процессора SPARC и Intel x64
JDK 9.
Параллелизм
Thread-Local Handshakes (Локальные рукопожатия потока) для остановки отдельных потоков
JDK 10Улучшена производительность мониторов конкурирующих объектов
JDK 9Дополнительное пространство в стеке потоков для критических секций, снижающее риск тупиковой ситуации при
java.util.concurrent
блокировках в случае переполнения стека
JDK 9
Компилятор
Возможность предварительной компиляции для Linux ( экспериментальная )
JDK 10 (Graal как экспериментальный JIT-компилятор) JDK 9 (интерфейс JVM-компилятора) JDK 9 (Graal как AoT-компилятор)Повышение производительности в javac: новая стратегия проверки типов многоязычных выражений
JDK 9
Сборщик мусора G1 (по умолчанию)
Распределение памяти с учетом NUMA
JDK 14Возможность прерывания смешанных коллекций для обеспечения поставленной пользователем паузы
JDK 12Автоматический возврат памяти кучи в операционную систему при простое
JDK 12Параллельный полный сборщик мусора для уменьшения задержек в худшем случае
JDK 10Сборщик мусора G1 теперь по умолчанию вместо Parallel GC
JDK 9
Другие сборщики мусора
Z Garbage Collector, предлагающий очень малое время задержки для больших куч
JDK 15 ( экспериментальный в JDK 14 (Windows) JDK 14 (OS X) JDK 11 (Linux))Сборщик мусора Shenandoah, предлагающий те же преимущества, что и ZGC, но основанный на другом алгоритме
JDK 15 ( экспериментальный в JDK 12)Сборщик мусора Epsilon, который не реализует фактическое восстановление памяти, стремясь к минимально возможным накладным расходам
JDK 11XX:AllocateHeapAt=<path>
для поддержки альтернативных устройств памяти
JDK 10
Диагностика и инструменты
Потоковая передача событий Flight Recorder: данные профилирования доступны через API , что делает его пригодным для непрерывного мониторинга
JDK 14Microbenchmark Suite на основе JMH
JDK 12Flight Recorder является частью OpenJDK
JDK 11Профилирование кучи с низкими издержками через JMTI
JDK 11Управляемый во время выполнения и специфичный для метода контроль компиляторов C1 и C2, который позволяет включать тесты
JDK 9Детализированная, простая в настройке система ведения журнала для всех компонентов JVM
JDK 9 (унифицированное ведение журнала JVM) JDK 9 (унифицированное ведение журнала сборщика мусора)Разрешить приложению предоставлять реализацию системы журналирования для использования классами платформы
JDK 9
Улучшения безопасности
Набор сертификатов корневого центра сертификации (CA) по умолчанию предоставляется с JDK, поэтому соединения TLS работают из коробки
JDK 10Валидация входящих данных сериализации
JDK 9Тип хранилища ключей по умолчанию - стандартный PKCS12 вместо проприетарного JKS
JDK 9.Основанный на DRBG
SecureRandom
JDK 9 наОтключены цепочки сертификатов X.509 с подписями на основе SHA-1
JDK 9Хеш-алгоритмы SHA-3
JDK 9
TLS
Поддержка TLS 1.3
JDK 11Datagram Transport Layer Security (DTLS) API
JDK 9OCSP сшивает TLS для улучшения производительности проверки статуса сертификата
JDK 9TLS Application-Layer Protocol Negotiation (ALPN) Extension, который обеспечивает согласование протокола без дополнительных циклов передачи; ALPN требуется для соединений HTTP/ 2
JDK 9
Крипто
Алгоритм цифровой подписи по кривой Эдвардса (EdDSA) - RFC8032
JDK 15Ключевое соглашение с Curve25519 и Curve448
JDK 11Криптографические алгоритмы ChaCha20 и Poly1305
JDK 11
Запуск
Запуск однофайловых программ с исходным кодом, включая поддержку shebang(
#!
) строки в Unix
JDK 11jshell
: Java REPL
JDK 9 (Project Kulla)
> Связано: Создание прототипов с помощью JShellКомпиляция для Старых Версий платформы с
--release
, который конфигурирует--source
и--target
и ссылок против соответствующей версии платформы
JDK 9Ранняя проверка флагов командной строки JVM во избежание сбоев
JDK 9
Упаковка
Packaging Tool, поддерживающий собственные форматы пакетов: msi, exe, pkg, dmg, deb и rpm ( Incubator )
JDK 14jlink
Компоновщик Java, который может создать оптимизированный тонкий образ времени выполнения для модульного приложения Java, который содержит только необходимые части JDK
JDK 9 - [ 2 ], [ 3 ], [ 4 ], [ 4 ], [ 5 ]Файлы JAR с несколькими релизами, позволяющие использовать несколько версий класса для конкретных релизов Java в одном архиве
JDK 9
Javadoc
Инструмент Javadoc теперь генерирует разметку HTML5 вместо макета на основе фреймов, а документация содержит поле поиска для облегчения навигации
Байт-код
Замена
Unsafe::defineAnonymousClass()
наLookup::defineHiddenClass()
, предназначенная для фреймворков для динамического создания скрытых классов, которые не могут быть обнаружены, связаны и использованы напрямую другими классами.Пакет
java.lang.invoke.constant
, позволяющий легко описывать загружаемые константы (операнды дляldc
инструкции), что менее подвержено ошибкам, чем использование специального строкового представления
JDK 12CONSTANT_Dynamic
запись постоянного пула, которая использует загрузку для выполнения разрешения, аналогичноINVOKEDYNAMIC
вызовам
JDK 11Введение контекста управления доступом Nest, который объединяет классы в одну и ту же сущность кода - например, вложенные классы - и устраняет необходимость для компилятора вставлять методы моста в сгенерированный байт-код.
JDK 11Байт-код, созданный для статической конкатенации строк, использует
invokedynamic
вместо прямого созданияStringBuilder#append
цепочек. Это позволит в будущем оптимизировать конкатенацию строк без изменения байт-кода.
JDK 9INVOKEDYNAMIC
может выражать высокоуровневые операции со свойствами объекта и / или коллекциями
JDK 9
Новые поддерживаемые платформы
Схема новой версии
Устаревание и удаление
Удалена Nashorn Javascript Engine и
jjs
инструмент
JDK 15 (не рекомендуется в JDK 11 )Устарела RMI Activation (активация RMI), влияющая на
java.rmi.activation
пакет иrmid
инструмент, не влияет на Java RMI в целом
JDK 15Отключена Biased Locking (предвзятая блокировка) по умолчанию, исключены соответствующие флаги командной строки
JDK 15Устарела
Unsafe::defineAnonymousClass()
JDK 15Удален сборщик мусора Concurrent Mark Sweep (CMS)
JDK 14Устарела комбинация ParallelScavenge + SerialOld GC
JDK 14Удалены инструменты Pack200 и API
JDK 14Устарели инструменты Pack200 и API
JDK 11Удалена Java EE
JDK 11Удалена CORBA
JDK 11Удалены
Thread#destroy
иThread#stop
JDK 11var
больше не является допустимым именем класса
JDK 10Удален инструмент javah
JDK 10Подчеркивание больше не является действительным идентификатором
JDK 9Удалены пакеты
apple.applescript
иcom.apple
JDK 9Отключены цепочки сертификатов X.509 с подписями на основе SHA-1
JDK 9Удалить директивы выбора версии JRE при запуске:
JRE-Version
запись в манифесте и-version:
параметр cli
JDK 9Удален инструмент jhat
JDK 9Удален JVM TI hprof Agent
JDK 9Удалены комбинации GC, устаревшие в JDK 8
JDK 9ResourceBundle загружает файлы свойств в UTF-8 вместо ISO-8859-1
JDK 9Устарело API апплета
JDK 9Устарела Concurrent Mark Sweep Garbage Collector
JDK 9Устарела
Object.finalize()
JDK 9Удалены механизмы переопределения одобренных стандартов (
lib/endorsed
) и расширений (lib/ext
) из JRE
JDK 9Удален
rt.jar
из JRE
JDK 9
Если вам интересно узнать обо всех различиях API между Java 8 и 14, посмотрите сайт проекта Java Almanac . Также ознакомьтесь с jdeps, анализатором зависимостей классов Java, чтобы узнать, использует ли ваш проект старый внутренний API.
Резюме
JDK 8 был выпущен в 2014 году. Нам пришлось ждать выхода JDK 9 три с половиной года . Но с тех пор дела пошли быстрее. У Java есть новая структура релизов, цель которой - выпускать новую версию каждые шесть месяцев.
Хотя Java 8 все еще поддерживается, переход на последнюю версию вносит в таблицу значительное количество улучшений.
C4ET4uK
Переводил как-будто не джавист (может вообще
автоперевод?). Многое переведено из того, что переводить не надо, другое переведено не так, как общепринято.
val6852 Автор
Просьба уточнить что не так — исправлю.
shapovalex
Да тут половина текста не так. Явно или машинный перевод или перевод слово в слово. На русском так не говорят.
Как пример:
MamOn
Да, вы кажется правы, похоже на автоматический перевод:
| Обновите анализатор XML JDK, Xerces, до версии 2.11.0
val6852 Автор
в Java 12 switch вместо оператора стал выражением
shapovalex
Да, но не переводятся ключевые слова на русский язык.
val6852 Автор
в Java 12 switch вместо оператора стал выражением