История версий Java


Языка Java претерпел несколько изменений с JDK  1.0, а также многочисленных добавлений классов и пакетов в стандартной библиотеке . Начиная с J2SE 1.4, развитие языка Java регулируется процессом сообщества Java (JCP), который использует запросы спецификации Java (JSR) для предложения и определения дополнений и изменений в платформе Java . Язык указан в спецификации языка Java (JLS); изменения в JLS управляются в соответствии с JSR 901 .

Помимо языковых изменений, за прошедшие годы в библиотеку классов Java были внесены и другие изменения , которые выросли с нескольких сотен классов в JDK 1.0 до более трех тысяч в J2SE 5. Полностью новые API , такие как Swing и Java2D , были введены, и многие из исходных классов и методов JDK 1.0 устарели . Некоторые программы позволяют преобразовывать программы Java из одной версии платформы Java в более старую (например, Java 5.0, перенесенная на 1.4) (см. Инструменты резервного копирования Java ).

Что касается плана поддержки Oracle Java SE, [1] версия 11 является поддерживаемой в настоящее время версией долгосрочной поддержки (LTS) вместе с Java 8 LTS, в которой клиенты Oracle получат поддержку Oracle Premier. Последнее бесплатное общедоступное обновление программного обеспечения Java 8 LTS для коммерческого использования было выпущено Oracle в январе 2019 года, в то время как Oracle продолжает выпускать бесплатные общедоступные обновления Java 8 для разработки [1] и личного использования на неопределенный срок. [2] Поддержка Java 10, ранее поддерживавшейся версии быстрого выпуска, закончилась в сентябре 2018 г., в тот же день, когда началась поддержка Java 11. Java 7 больше не поддерживается публично. Для Java 11 долгосрочная поддержка Oracle не будет предоставляться общественности; вместо этого ожидается , что более широкое сообщество OpenJDK , такое как AdoptOpenJDK или другие, выполнит эту работу. [3]

Общая доступность Java 16 состоялась 16 марта 2021 г., и Java 17 сейчас также находится в разработке. [4]

В сентябре 2017 года Марк Рейнхольд, главный архитектор платформы Java, предложил изменить последовательность выпусков на «один выпуск функции каждые шесть месяцев» вместо текущего двухлетнего графика [9] [10], и позже предложение вступило в силу. .

Первая версия была выпущена 23 января 1996 года. [11] [12] Первая стабильная версия, JDK 1.0.2, называется Java 1. [12]

Основные дополнения к выпуску от 19 февраля 1997 г. включали: [13]

J2SE 1.2

Codename Playground

Выпуск от 8 декабря 1998 г. и последующие выпуски через J2SE 5.0 были ретроспективно переименованы в Java 2, а название версии «J2SE» ( Java 2 Platform, Standard Edition ) заменило JDK, чтобы отличить базовую платформу от J2EE ( Java 2 Platform, Enterprise Edition ) и J2ME ( платформа Java 2, Micro Edition ). Это был очень важный выпуск Java, поскольку он утроил размер платформы Java до 1520 классов в 59 пакетах. Основные дополнения: [15]

  • strictfp ключевое слово
  • Качели графический API был интегрирован в основные классы
  • JVM Sun был оснащен JIT компилятором в первый раз
  • Плагин Java
  • Java IDL , реализация IDL для взаимодействия с CORBA
  • Рамки коллекций

Кодовое имя пустельга

Наиболее заметными изменениями в версии от 8 мая 2000 г. были: [16] [17]

  • Включена JVM HotSpot (JVM HotSpot была впервые выпущена в апреле 1999 г. для J2SE 1.2 JVM)
  • RMI был изменен для поддержки дополнительной совместимости с CORBA.
  • Интерфейс именования и каталогов Java (JNDI) включен в основные библиотеки (ранее был доступен как расширение)
  • Архитектура отладчика платформы Java (JPDA)
  • JavaSound
  • Синтетические прокси-классы

Кодовое имя Мерлин

Выпуск от 6 февраля 2002 г. был первым выпуском платформы Java, разработанной в рамках процесса сообщества Java как JSR 59 . Основные изменения включали: [18] [19]

  • Изменения языка
    • assertключевое слово (указано в JSR 41 )
  • Улучшения библиотеки
    • Регулярные выражения смоделированных после Perl регулярных выражений
    • Цепочка исключений позволяет исключению инкапсулировать исходное исключение нижнего уровня
    • Поддержка интернет-протокола версии 6 ( IPv6 )
    • Неблокирующий ввод-вывод (Java) (с именем NIO) (указан в JSR 51 )
    • Logging API (указано в JSR 47 )
    • API ввода-вывода изображений для чтения и записи изображений в таких форматах, как JPEG и PNG.
    • Интегрированный синтаксический анализатор XML и процессор XSLT ( JAXP ) (указанный в JSR 5 и JSR 63 )
    • Встроенные расширения безопасности и криптографии ( JCE , JSSE , JAAS )
    • Включена Java Web Start (Java Web Start впервые была выпущена в марте 2001 года для J2SE 1.3) (указана в JSR 56 )
    • API настроек ( java.util.prefs)

Публичная поддержка и обновления безопасности для Java 1.4 закончились в октябре 2008 года. Платные обновления безопасности для клиентов Oracle закончились в феврале 2013 года. [20]

Кодовое имя Тигр

Релиз от 30 сентября 2004 г. изначально имел номер 1.5, который до сих пор используется в качестве внутреннего номера версии. Номер был изменен на «лучше отражает уровень зрелости, стабильности, масштабируемости и безопасности J2SE». [21] Эта версия была разработана под JSR 176 .

J2SE 5.0 вступил в период окончания периода публичных обновлений 8 апреля 2008 г .; с 3 ноября 2009 г. обновления больше не доступны для широкой публики. Обновления были доступны для платных клиентов Oracle до мая 2015 г. [1]

Tiger добавил ряд важных новых языковых функций: [22] [23]

  • Generics : обеспечивает безопасность типов во время компиляции (статическую) для коллекций и устраняет необходимость в большинстве типов (преобразование типов) (определяется JSR 14 )
  • Метаданные : также называемые аннотациями ; позволяет помечать языковые конструкции, такие как классы и методы, с дополнительными данными, которые затем могут обрабатываться утилитами, поддерживающими метаданные (указанными в JSR 175 )
  • Autoboxing / unboxing: автоматические преобразования между примитивными типами (такими как int) и примитивными классами-оболочками (такими как Integer) (заданными JSR 201 )
  • Перечисления : enumключевое слово создает типизированный , упорядоченный список значений (например Day.MONDAY, Day.TUESDAYи т.д.); ранее это могло быть достигнуто только с помощью нетипизированных постоянных целых чисел или вручную созданных классов (шаблон типизированного перечисления) (указанный в JSR 201 )
  • Varargs : последний параметр метода теперь может быть объявлен с использованием имени типа, за которым следует три точки (например void drawtext(String... lines)); в вызывающем коде может использоваться любое количество параметров этого типа, и затем они помещаются в массив для передачи методу, или, альтернативно, вызывающий код может передать массив этого типа.
  • Расширенный for eachцикл: forсинтаксис цикла расширен специальным синтаксисом для перебора каждого члена массива или любого Iterable, например стандартных Collectionклассов (указанных в JSR 201 )
  • Улучшена семантика выполнения многопоточных программ Java; новая модель памяти Java решает проблемы сложности, эффективности и производительности предыдущих спецификаций [24]
  • Статический импорт

Также были внесены следующие улучшения в стандартные библиотеки:

  • Автоматическая генерация заглушки для объектов RMI
  • Swing : новый внешний вид с возможностью смены скинов , называемый синтезатором.
  • В параллельности утилиты в пакете [25]java.util.concurrent
  • Класс сканера для анализа данных из различных входных потоков и буферов

Java 5 - это последний выпуск Java, официально поддерживающий Microsoft Windows 98 и Windows ME , [26] в то время как Windows Vista была новейшей версией Windows, на которой J2SE 5 поддерживалась до того, как Java 5 закончился в октябре 2009 года. . [20]

Java 5 Update 5 (1.5.0_05) - это последний выпуск Java, работающий в Windows 95 (с установленным Internet Explorer 5.5 ) и Windows NT 4.0 . [27]

Java 5 была впервые доступна в Apple Mac OS X 10.4 (Tiger) [28] и была версией Java по умолчанию, установленной в Apple Mac OS X 10.5 (Leopard).

Публичная поддержка и обновления безопасности для Java 1.5 закончились в ноябре 2009 года. Платные обновления безопасности для клиентов Oracle закончились в апреле 2015 года.

Изменение версий

Эта версия представила новую систему управления версиями для языка Java, хотя старая система управления версиями продолжала использоваться для библиотек разработчиков:

Оба номера версии «1.5.0» и «5.0» используются для обозначения этого выпуска Java 2 Platform Standard Edition. Версия «5.0» - это версия продукта, а «1.5.0» - версия для разработчика. Число «5.0» используется для лучшего отражения уровня зрелости, стабильности, масштабируемости и безопасности J2SE.

-  Версия 1.5.0 или 5.0?[29]

Это соответствие продолжалось и в более поздних выпусках (Java 6 = JDK 1.6, Java 7 = JDK 1.7 и т. Д.).

Обновления Java 5

Кодовое имя Мустанг

В версии, выпущенной 11 декабря 2006 года, Sun заменила имя «J2SE» на Java SE и удалила «.0» из номера версии. [47] Внутренняя нумерация для разработчиков остается 1.6.0. [48]

Эта версия была разработана под JSR 270 .

На этапе разработки новые сборки, включая улучшения и исправления ошибок, выпускались примерно еженедельно. Бета-версии были выпущены в феврале и июне 2006 г., а окончательный выпуск состоялся 11 декабря 2006 г.

Основные изменения, внесенные в эту версию: [49] [50]

  • Прекращена поддержка старых версий Win9x; неофициально Java 6 Update 7 была последней версией Java, работающей с этими версиями Windows. [ необходима цитата ] Это считается [ кем? ] в связи с крупными изменениями в обновлении 10.
  • Поддержка языка сценариев ( JSR 223 ): общий API для тесной интеграции с языками сценариев и встроенная интеграция Mozilla JavaScript Rhino .
  • Значительные улучшения производительности базовой платформы [51] [52] и Swing .
  • Улучшенная поддержка веб-сервисов через JAX-WS ( JSR 224 ).
  • Поддержка JDBC 4.0 ( JSR 221 ).
  • Java Compiler API ( JSR 199 ): API, позволяющий Java-программе выбирать и вызывать Java-компилятор программно.
  • Обновление JAXB до версии 2.0: включая интеграцию парсера StAX .
  • Поддержка подключаемых аннотаций ( JSR 269 ). [53]
  • Многие улучшения графического интерфейса , такие как интеграция SwingWorker в API, сортировка и фильтрация таблиц и настоящая двойная буферизация Swing (устранение эффекта серой зоны).
  • Улучшения JVM включают: оптимизацию синхронизации и производительности компилятора , новые алгоритмы и обновления существующих алгоритмов сборки мусора , а также производительность запуска приложений.

Java 6 можно установить в Mac OS X 10.5 (Leopard), работающем на компьютерах с 64-разрядными процессорами (Core 2 Duo и выше). [54] Java 6 также поддерживается как 32-битными, так и 64-битными машинами под управлением Mac OS X 10.6 (Snow Leopard).

Срок поддержки Java 6 подошел к концу в феврале 2013 года, когда все общедоступные обновления, включая обновления безопасности, должны были быть остановлены. [55] [56] Oracle выпустила еще два обновления для Java 6 в марте и апреле 2013 года, в которых были исправлены некоторые уязвимости системы безопасности. [57] [58]

Обновления Java 6

После выпуска Java 6 Sun, а затем Oracle выпустили несколько обновлений, которые, хотя и не изменили общедоступный API, улучшили удобство использования конечным пользователем или исправили ошибки. [59]

Java 7 (кодовое имя Dolphin [137] ) - это крупное обновление, которое было выпущено 7 июля 2011 г. [138] и стало доступным для разработчиков 28 июля 2011 г. [139] Период разработки был разбит на тринадцать этапов; 6 июня 2011 года завершился последний из тринадцати этапов. [139] [140] В среднем за один этап выпускалось 8 сборок (которые обычно включали улучшения и исправления ошибок). В списке возможностей проекта OpenJDK 7 перечислены многие изменения.

Дополнения в Java 7 включают: [141]

  • Поддержка JVM для динамических языков с новым invokedynamicбайт-кодом под JSR-292, [142] после работы по созданию прототипа, которая в настоящее время выполняется на многоязыковой виртуальной машине.
  • Сжатые 64-битные указатели [143] (доступны в Java 6 с -XX:+UseCompressedOops) [144]
  • Эти небольшие языковые изменения (сгруппированы в рамках проекта под названием Coin): [145]
  • Строки в переключателе [146]
  • Автоматическое управление ресурсами в инструкции try [147]
  • Улучшенный вывод типа для создания универсального экземпляра, также известного как ромбовидный оператор <> [148]
  • Упрощенное объявление метода varargs [149]
  • Целочисленные двоичные литералы [150]
  • Разрешение подчеркивания в числовых литералах [151]
  • Перехват нескольких типов исключений и повторное генерирование исключений с улучшенной проверкой типов [152]
  • Утилиты параллелизма под JSR 166 [153]
  • Новая библиотека файлового ввода-вывода (определенная JSR 203), добавляющая поддержку нескольких файловых систем, метаданных файлов и символических ссылок. Новые пакеты java.nio.file, java.nio.file.attributeи java.nio.file.spi[154] [155]
  • Timsort используется для сортировки коллекций и массивов объектов вместо сортировки слиянием.
  • Поддержка на уровне библиотеки алгоритмов криптографии с эллиптическими кривыми
  • XRender трубопровод для Java 2D, что улучшает управляемость возможностей , характерных для современных графических процессоров
  • Новые API платформы для графических функций, изначально реализованные в версии 6u10 как неподдерживаемые API [156]
  • Расширенная поддержка на уровне библиотеки новых сетевых протоколов, включая SCTP и протокол Sockets Direct.
  • Upstream обновления XML и Unicode
  • Наборы правил развертывания Java [157]

Lambda (реализация лямбда-функций в Java), Jigsaw (реализация модулей в Java ) и часть Coin были исключены из Java 7 и выпущены как часть Java 8 (за исключением Jigsaw , выпущенного в Java 9). [158] [159]

Java 7 была версией по умолчанию для загрузки на java.com с апреля 2012 года до выпуска Java 8. [160]

Обновления Java 7

Oracle выпускала общедоступные обновления для семейства Java 7 ежеквартально [161] до апреля 2015 года, когда продукт достиг конца своей публичной доступности. [162] Дальнейшие обновления для JDK 7, которые планируется продлить до июля 2022 года, доступны только для клиентов с контрактом на поддержку. [163]

Java 8 была выпущена 18 марта 2014 г. [230] [231] и включала некоторые функции, которые были запланированы для Java 7, но позже отложены. [232]

Работа над функциями была организована в рамках предложений по расширению JDK (JEP) . [233]

  • JSR 335, JEP 126: поддержка на уровне языка лямбда-выражений (официально лямбда-выражения; неофициально - замыкания ) в рамках проекта Lambda [234] и методов по умолчанию (методы виртуального расширения ) [235] [236] [237], которые позволяют добавлять методов для интерфейсов без нарушения существующих реализаций. В сообществе Java продолжались дискуссии о том, следует ли добавлять поддержку лямбда-выражений. [238] [239] Sun позже объявила, что лямбда-выражения будут включены в Java, и попросила сообщество внести вклад в улучшение этой функции. [240] Поддержка лямбда-выражений также позволяет выполнять операции в функциональном стиле с потоками элементов, такие как преобразования коллекций в стиле MapReduce . Методы по умолчанию позволяют автору API добавлять новые методы в интерфейс, не нарушая старый код, используя его. Хотя это не было их основной целью, [235] методы по умолчанию также допускают множественное наследование поведения (но не состояния).
  • JSR 223, JEP 174: Project Nashorn, a JavaScript runtime which allows developers to embed JavaScript code within applications
  • JSR 308, JEP 104: Annotation on Java types[241]
  • Unsigned integer arithmetic[242]
  • JSR 337, JEP 120: Repeating annotations[243]
  • JSR 310, JEP 150: Date and time API[244]
  • JEP 178: Statically-linked JNI libraries[245]
  • JEP 153: Launch JavaFX applications (direct launching of JavaFX application JARs)[246]
  • JEP 122: Remove the permanent generation[247]

Java 8 is not supported on Windows XP[248] but as of JDK 8 update 25, it can still be installed and run under Windows XP.[249] Previous updates of JDK 8 could be run under XP by downloading archived zip format file and unzipping it for the executable.The last version of Java 8 could run on XP is update 251.But the its components compatibility starts to break on unsupported OS in early build during Java 8 updates development.[citation needed]

From October 2014, Java 8 was the default version to download (and then again the download replacing Java 9) from the official website.[250] "Oracle will continue to provide Public Updates and auto updates of Java SE 8, Indefinitely for Personal Users".[2]

Java 8 updates

Java SE 9 was made available on September 21, 2017,[302] due to controversial acceptance of the current implementation of Project Jigsaw by Java Executive Committee,[303] which led Oracle to fix some open issues and concerns, and to refine some critical technical questions. In the last days of June 2017, Java Community Process expressed nearly unanimous consensus on the proposed Module System scheme.[304]

  • JSR 376: Modularization of the JDK under Project Jigsaw (Java Platform Module System)[159]
  • JavaDB was removed from JDK[305]
  • JEP 193: Variable handles : define a standard means to invoke the equivalents of various java.util.concurrent.atomic and sun.misc.Unsafe operations
  • JEP 213: Milling Project Coin : Allow @SafeVarargs on private instance methods; Allow effectively-final variables to be used as resources in the try-with-resources statement; Allow diamond with anonymous classes if the argument type of the inferred type is denotable; Complete the removal, begun in Java SE 8, of underscore from the set of legal identifier names; Support for private methods in interfaces
  • JEP 222: jshell: The Java Shell (Read-Eval-Print Loop) : JShell is a REPL command-line interface for the Java language.[306]
  • JEP 254: Compact Strings
  • JEP 263: HiDPI graphics: automatic scaling and sizing
  • JEP 266: More concurrency updates : It includes a Java implementation of Reactive Streams,[307] including a new Flow class[308] that included the interfaces previously provided by Reactive Streams[309]
  • JEP 268: XML catalogs
  • JEP 282: jlink: The Java Linker : create a tool that can assemble and optimize a set of modules and their dependencies into a custom run-time image. It effectively allows to produce a fully usable executable including the JVM to run it
  • JEP 295: Ahead-of-Time Compilation : Ahead-of-time compilation provided by GraalVM.

The first Java 9 release candidate was released on August 9, 2017.[310] The first stable release of Java 9 was on September 21, 2017.[311]

History

At JavaOne 2011, Oracle discussed features they hoped to release for Java 9 in 2016.[312] Java 9 should include better support for multi-gigabyte heaps, better native code integration, a different default garbage collector (G1, for "shorter response times")[313] and a self-tuning JVM.[314] In early 2016, the release of Java 9 was rescheduled for March 2017[315] and later again postponed four more months to July 2017.[316]

Java 9 updates

OpenJDK 10 was released on March 20, 2018, with twelve new features confirmed.[320] Among these features were:

  • JEP 286: Local-Variable Type Inference
  • JEP 296: Consolidate the JDK Forest into a Single Repository
  • JEP 304: Garbage-Collector Interface
  • JEP 307: Parallel Full GC for G1
  • JEP 310: Application Class-Data Sharing
  • JEP 312: Thread-Local Handshakes
  • JEP 313: Remove the Native-Header Generation Tool (javah)
  • JEP 314: Additional Unicode Language-Tag Extensions
  • JEP 316: Heap Allocation on Alternative Memory Devices
  • JEP 317: Experimental Java-Based JIT Compiler
  • JEP 319: Root Certificates
  • JEP 322: Time-Based Release Versioning

The first of these JEP 286 Local-Variable Type Inference, allows the var keyword to be used for local variables with the actual type calculated by the compiler. So we can do

var list = new ArrayList<String>(); // infers ArrayListvar stream = list.stream(); // infers Stream

Java 10 updates

JDK 11 was released on September 25, 2018 and the version is currently open for bug fixes. It offers LTS, or Long Term Support. Among others, Java 11 includes a number of new features, such as:[326]

  • JEP 181: Nest-Based Access Control
  • JEP 309: Dynamic Class-File Constants
  • JEP 315: Improve Aarch64 Intrinsics
  • JEP 318: Epsilon: A No-Op Garbage Collector
  • JEP 320: Remove the Java EE and CORBA Modules
  • JEP 321: HTTP Client (Standard)
  • JEP 323: Local-Variable Syntax for Lambda Parameters
  • JEP 324: Key Agreement with Curve25519 and Curve448
  • JEP 327: Unicode 10
  • JEP 328: Flight Recorder
  • JEP 329: ChaCha20 and Poly1305 Cryptographic Algorithms
  • JEP 330: Launch Single-File Source-Code Programs
  • JEP 331: Low-Overhead Heap Profiling
  • JEP 332: Transport Layer Security (TLS) 1.3
  • JEP 333: ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
  • JEP 335: Deprecate the Nashorn JavaScript Engine
  • JEP 336: Deprecate the Pack200 Tools and API

A number of features from previous releases were dropped; in particular, Java applets and Java Web Start are no longer available. JavaFX, Java EE and CORBA modules have been removed from JDK[327]

Java 11 updates

JDK 12 was released on March 19, 2019. Among others, Java 12 includes a number of new features, such as:[340]

  • JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)
  • JEP 230: Microbenchmark Suite
  • JEP 325: Switch Expressions (Preview)
  • JEP 334: JVM Constants API
  • JEP 340: One AArch64 Port, Not Two
  • JEP 341: Default CDS Archives
  • JEP 344: Abortable Mixed Collections for G1
  • JEP 346: Promptly Return Unused Committed Memory from G1

The preview feature Jep 325 extends the switch statement so it can be also be used as expression, and add a new form of case label where the right hand side is a expression. No break statement is needed. For complex expressions a yield statement can be used. This becomes standard in Java SE 14.

int ndays = switch(month) { case JAN, MAR, MAY, JUL, AUG, OCT, DEC -> 31; case APR, JUN, SEP, NOV -> 30; case FEB -> { if(year % 400 ==0) yield 29; else if(year % 100 == 0) yield 28; else if(year % 4 ==0) yield 29; else yield 28; }};

Java 12 updates

JDK 13 was released on September 17, 2019. Java 13 includes the following new features, as well as "hundreds of smaller enhancements and thousands of bug fixes".[344]

  • JEP 350: Dynamic CDS Archives
  • JEP 351: ZGC: Uncommit Unused Memory
  • JEP 353: Reimplement the Legacy Socket API
  • JEP 354: Switch Expressions (Preview)
  • JEP 355: Text Blocks (Preview)

JEP 355 Text Blocks allows multiline string literals:

String html = """ en">  

Hello, world