Le langage Java a subi plusieurs changements depuis JDK 1.0 ainsi que de nombreux ajouts de classes et de packages à la bibliothèque standard . Depuis J2SE 1.4, l'évolution du langage Java est régie par le Java Community Process (JCP), qui utilise les Java Specification Requests (JSR) pour proposer et spécifier des ajouts et des modifications à la plateforme Java . Le langage est spécifié par la Java Language Specification (JLS) ; les modifications apportées à la JLS sont gérées sous JSR 901. En septembre 2017, Mark Reinhold, architecte en chef de la plateforme Java, a proposé de modifier le train de publication à « une publication de fonctionnalité tous les six mois » plutôt que le calendrier de deux ans alors en vigueur. Cette proposition a pris effet pour toutes les versions suivantes et constitue toujours le calendrier de publication actuel.
Outre les changements de langage, d'autres changements ont été apportés à la bibliothèque de classes Java au fil des ans, qui est passée de quelques centaines de classes dans JDK 1.0 à plus de trois mille dans J2SE 5. De nouvelles API entières , telles que Swing et Java2D , ont été introduites, et de nombreuses classes et méthodes originales du JDK 1.0 sont devenues obsolètes , et très peu d'API ont été supprimées (au moins une, pour le threading, dans Java 22 ). Certains programmes permettent la conversion de programmes Java d'une version de la plateforme Java vers une version plus ancienne (par exemple Java 5.0 rétroporté vers 1.4) (voir Outils de rétroportage Java ).
Concernant la feuille de route de support Java SE d'Oracle , Java SE 23 est la dernière version, tandis que les versions 21, 17, 11 et 8 sont les versions de support à long terme (LTS) actuellement prises en charge, où les clients Oracle recevront Oracle Premier Support. Oracle continue de publier des mises à jour publiques gratuites de Java 8 pour le développement et l'utilisation personnelle indéfiniment. Oracle continue également de publier des mises à jour publiques gratuites de Java 17 LTS pour tous les utilisateurs, y compris l'utilisation commerciale et de production jusqu'en septembre 2024.
Dans le cas d' OpenJDK , un support commercial à long terme et des mises à jour logicielles gratuites sont disponibles auprès de plusieurs organisations de la communauté au sens large .
Java 23 est sorti le 17 septembre 2024.
Tableau de diffusion
JDK 1.0
La première version a été publiée le 23 janvier 1996. La première version stable, JDK 1.0.2, s'appelle Java 1.
JDK 1.1
Les ajouts majeurs dans la version du 19 février 1997 comprenaient :
- refonte complète du modèle d'événement de l' Abstract Window Toolkit (AWT)
- classes internes ajoutées au langage
- JavaBeans
- Connectivité de base de données Java (JDBC)
- Invocation de méthode à distance Java (RMI) et sérialisation
- réflexion qui prenait en charge uniquement l'introspection, aucune modification lors de l'exécution n'était possible. (La possibilité de modifier les objets de manière réflexive a été ajoutée dans J2SE 1.2, en introduisant la classe AccessibleObject et ses sous-classes telles que la classe Field.)
- Compilation juste à temps (JIT) sur les plates-formes Microsoft Windows , produite pour JavaSoft par Symantec
- Internationalisation et prise en charge Unicode provenant de Taligent
J2SE 1.2
La version du 8 décembre 1998 et les versions suivantes jusqu'à J2SE 5.0 ont été rebaptisées rétrospectivement Java 2 et le nom de version « J2SE » ( Java 2 Platform, Standard Edition ) a remplacé JDK pour distinguer la plate-forme de base de J2EE ( Java 2 Platform, Enterprise Edition ) et J2ME ( Java 2 Platform, Micro Edition ). Il s'agissait d'une version très importante de Java car elle a triplé la taille de la plate-forme Java à 1520 classes dans 59 packages. Les ajouts majeurs comprenaient :
strictfpmot-clé (par JVM 17 un mot-clé obsolète, ne doit pas être utilisé dans le nouveau code)- L' API graphique Swing a été intégrée aux classes principales.
- La JVM de Sun a été équipée pour la première fois d'un compilateur JIT .
- Plugin Java
- Java IDL , une implémentation IDL pour l'interopérabilité CORBA
- Cadre de collections
J2SE 1.3
Les changements les plus notables dans la version du 8 mai 2000 étaient :
- JVM HotSpot incluse (la JVM HotSpot a été publiée pour la première fois en avril 1999 pour la JVM J2SE 1.2)
- RMI a été modifié pour prendre en charge la compatibilité facultative avec CORBA .
- Java Naming and Directory Interface (JNDI) inclus dans les bibliothèques principales (précédemment disponible en tant qu'extension)
- Architecture du débogueur de la plate-forme Java (JPDA)
- Son Java
- Classes proxy synthétiques
Java 1.3 est la dernière version de Java à prendre officiellement en charge Microsoft Windows 95. [
J2SE 1.4
La version du 6 février 2002 était la première version de la plateforme Java développée dans le cadre du processus communautaire Java sous le nom de JSR 59. Les principaux changements comprenaient :
- Changements de langue
assertmot-clé (spécifié dans JSR 41)
- Améliorations de la bibliothèque
- Expressions régulières calquées sur les expressions régulières Perl
- Le chaînage d'exceptions permet à une exception d'encapsuler l'exception de niveau inférieur d'origine
- Prise en charge du protocole Internet version 6 ( IPv6 )
- E/S non bloquantes (nommées NIO) (spécifiées dans JSR 51)
- API de journalisation (spécifiée dans JSR 47)
- API d'E/S d'image pour la lecture et l'écriture d'images dans des formats tels que JPEG et PNG
- Analyseur XML intégré et processeur XSLT ( JAXP ) (spécifié dans JSR 5 et JSR 63)
- Extensions de sécurité et de cryptographie intégrées ( JCE , JSSE , JAAS )
- Java Web Start inclus (Java Web Start a été publié pour la première fois en mars 2001 pour J2SE 1.3) (spécifié dans JSR 56)
- API de préférences (
java.util.prefs)
Le support public et les mises à jour de sécurité pour Java 1.4 ont pris fin en octobre 2008. Les mises à jour de sécurité payantes pour les clients Oracle ont pris fin en février 2013.
Java SE 5
La version du 30 septembre 2004 portait à l'origine le numéro 1.5, qui est toujours utilisé comme numéro de version interne. Le numéro a été modifié pour « mieux refléter le niveau de maturité, de stabilité, d'évolutivité et de sécurité du J2SE ». Cette version a été développée sous JSR 176.
Java SE 5 est entré dans sa période de fin de mises à jour publiques le 8 avril 2008 ; les mises à jour ne sont plus disponibles au public depuis le 3 novembre 2009. Les mises à jour étaient disponibles pour les clients Oracle payants jusqu'en mai 2015.
Tiger a ajouté un certain nombre de nouvelles fonctionnalités linguistiques importantes :
- Génériques : fournit une sécurité de type au moment de la compilation (statique) pour les collections et élimine le besoin de la plupart des conversions de type (spécifiées par JSR 14)
- Métadonnées : également appelées annotations ; permettent d'étiqueter des constructions de langage telles que des classes et des méthodes avec des données supplémentaires, qui peuvent ensuite être traitées par des utilitaires prenant en charge les métadonnées (spécifiés par JSR 175)
- Autoboxing / unboxing : conversions automatiques entre les types primitifs (tels que
int) et les classes wrapper primitives (telles queInteger) (spécifié par JSR 201) - Énumérations : le
enummot clé crée une liste ordonnée de valeurs de type sécurisé (telles queDay.MONDAY,Day.TUESDAY, etc.) ; auparavant, cela ne pouvait être réalisé qu'avec des entiers constants non sécurisés ou des classes construites manuellement (modèle d'énumération de type sécurisé) (spécifié par JSR 201) - Varargs : le dernier paramètre d'une méthode peut désormais être déclaré à l'aide d'un nom de type suivi de trois points (par exemple
void drawtext(String... lines)) ; dans le code appelant, n'importe quel nombre de paramètres de ce type peut être utilisé et ils sont ensuite placés dans un tableau à transmettre à la méthode, ou bien le code appelant peut transmettre un tableau de ce type - Boucle améliorée
for each: laforsyntaxe de boucle est étendue avec une syntaxe spéciale pour parcourir chaque membre d'un tableau ou de n'importe quel élémentIterable, comme lesCollectionclasses standard (spécifiées par JSR 201) - Sémantique d'exécution améliorée pour les programmes Java multithreads ; le nouveau modèle de mémoire Java répond aux problèmes de complexité, d'efficacité et de performances des spécifications précédentes
- Importations statiques
Les améliorations suivantes ont également été apportées aux bibliothèques standard :
- Génération automatique de stubs pour les objets RMI
- Swing : Nouveau look et ressenti personnalisables , appelés synth
- Les utilitaires de concurrence dans le package java.util.concurrent
- Classe de scanner pour l'analyse des données provenant de divers flux d'entrée et tampons
Java 5 est la dernière version de Java à prendre officiellement en charge Microsoft Windows 98 et Windows ME , tandis que Windows Vista était la version la plus récente de Windows sur laquelle Java SE 5 était pris en charge avant la fin de vie de Java 5 en octobre 2009.
Java 5 Update 5 (1.5.0_05) est la dernière version de Java à fonctionner sur Windows 95 (avec Internet Explorer 5.5 installé) et Windows NT 4.0 .
Java 5 a été disponible pour la première fois sur Apple Mac OS X 10.4 (Tiger) et était la version par défaut de Java installée sur Apple Mac OS X 10.5 (Leopard).
Le support public et les mises à jour de sécurité pour Java 1.5 ont pris fin en novembre 2009. Les mises à jour de sécurité payantes pour les clients Oracle ont pris fin en avril 2015.
Changement de version
Cette version a introduit un nouveau système de gestion des versions pour le langage Java, bien que l'ancien système de gestion des versions ait continué à être utilisé pour les bibliothèques de développement :
Les deux numéros de version « 1.5.0 » et « 5.0 » sont utilisés pour identifier cette version de Java 2 Platform Standard Edition. La version « 5.0 » correspond à la version du produit, tandis que « 1.5.0 » correspond à la version du développeur. Le numéro « 5.0 » est utilisé pour mieux refléter le niveau de maturité, de stabilité, d'évolutivité et de sécurité de J2SE.
— « Version 1.5.0 ou 5.0 ? », notes de version Java
Cette correspondance s'est poursuivie dans les versions ultérieures (Java 6 = JDK 1.6, Java 7 = JDK 1.7, etc.).
Java SE 6
À partir de la version publiée le 11 décembre 2006, Sun a remplacé le nom « J2SE » par Java SE et a supprimé le « .0 » du numéro de version. La numérotation interne pour les développeurs reste 1.6.0.
Cette version a été développée sous JSR 270.
Au cours de la phase de développement, de nouvelles versions comprenant des améliorations et des corrections de bugs ont été publiées environ chaque semaine. Des versions bêta ont été publiées en février et juin 2006, jusqu'à la version finale qui a eu lieu le 11 décembre 2006.
Modifications majeures incluses dans cette version :
- La prise en charge des anciennes versions de Win9x a été abandonnée ; officieusement, Java 6 Update 7 était la dernière version de Java qui fonctionnait sur ces versions de Windows. Cela est dû aux changements majeurs de la mise à jour 10.
- Prise en charge du langage de script ( JSR 223 ) : API générique pour une intégration étroite avec les langages de script et intégration intégrée de Mozilla JavaScript Rhino .
- Améliorations spectaculaires des performances de la plateforme principale, et Swing .
- Prise en charge améliorée du service Web via JAX-WS ( JSR 224 ).
- Prise en charge de JDBC 4.0 ( JSR 221 ).
- API du compilateur Java ( JSR 199 ) : une API permettant à un programme Java de sélectionner et d'appeler un compilateur Java par programmation.
- Mise à niveau de JAXB vers la version 2.0 : incluant l'intégration d'un analyseur StAX .
- Prise en charge des annotations enfichables ( JSR 269 ).
- De nombreuses améliorations de l'interface graphique , telles que l'intégration de SwingWorker dans l'API, le tri et le filtrage des tables et la véritable double mise en mémoire tampon Swing (éliminant l'effet de zone grise).
- Les améliorations de la JVM incluent : des optimisations de la synchronisation et des performances du compilateur , de nouveaux algorithmes et des mises à niveau des algorithmes de récupération de place existants , ainsi que des performances de démarrage des applications.
Java 6 peut être installé sur Mac OS X 10.5 (Leopard) exécuté sur des machines équipées de processeurs 64 bits (Core 2 Duo et supérieurs). Java 6 est également pris en charge par les machines 32 bits et 64 bits exécutant Mac OS X 10.6 (Snow Leopard).
Java 6 a atteint la fin de sa durée de vie en février 2013, date à laquelle toutes les mises à jour publiques, y compris les mises à jour de sécurité, devaient être arrêtées. Oracle a publié deux autres mises à jour de Java 6 en mars et avril 2013, qui ont corrigé certaines vulnérabilités de sécurité.
Mises à jour de Java 6
Après la sortie de Java 6, Sun, puis Oracle, ont publié plusieurs mises à jour qui, sans modifier aucune API publique, ont amélioré la convivialité pour l'utilisateur final ou corrigé des bogues.
Java SE 7
Java 7 est une mise à jour majeure lancée le 7 juillet 2011 et mise à disposition des développeurs le 28 juillet 2011. La période de développement a été organisée en treize étapes ; le 6 juin 2011, la dernière des treize étapes a été achevée. En moyenne, 8 builds (qui comprenaient généralement des améliorations et des corrections de bugs) ont été publiées par étape. La liste des fonctionnalités du projet OpenJDK 7 répertorie de nombreuses modifications.
Les ajouts dans Java 7 incluent :
- Prise en charge JVM des langages dynamiques , avec le nouveau
invokedynamicbytecode sous JSR-292, suite au travail de prototypage actuellement effectué sur la machine virtuelle multilingue - Pointeurs 64 bits compressés (disponibles dans Java 6 avec
-XX:+UseCompressedOops) - Caractéristiques linguistiques du projet Coin :
- Chaînes dans le commutateur
- Gestion automatique des ressources dans l'instruction try-statement, également appelée instruction try-with-resources
- Inférence de type améliorée pour la création d'instances génériques, également appelée opérateur diamant
<> - Déclaration simplifiée de la méthode varargs
- Littéraux entiers binaires
- Autoriser les traits de soulignement dans les littéraux numériques
- Capture de plusieurs types d'exceptions et relance des exceptions avec une vérification de type améliorée
- Utilitaires de concurrence sous JSR 166
- Nouvelle bibliothèque d'E/S de fichiers (définie par JSR 203) ajoutant la prise en charge de plusieurs systèmes de fichiers, de métadonnées de fichiers et de liens symboliques. Les nouveaux packages sont
java.nio.file,java.nio.file.attributeetjava.nio.file.spi - Timsort est utilisé pour trier des collections et des tableaux d'objets au lieu du tri par fusion
- Prise en charge au niveau de la bibliothèque des algorithmes de cryptographie à courbe elliptique
- Un pipeline XRender pour Java 2D, qui améliore la gestion des fonctionnalités spécifiques aux GPU modernes
- Nouvelles API de plate-forme pour les fonctionnalités graphiques initialement implémentées dans la version 6u10 en tant qu'API non prises en charge
- Prise en charge améliorée au niveau de la bibliothèque pour les nouveaux protocoles réseau, notamment SCTP et Sockets Direct Protocol
- Mises à jour en amont de XML et Unicode
- Ensembles de règles de déploiement Java
Lambda (l'implémentation Java des fonctions lambda ), Jigsaw (l'implémentation Java des modules ) et une partie de Coin ont été abandonnés à partir de Java 7 et publiés dans le cadre de Java 8 (à l'exception de Jigsaw , qui a été publié dans Java 9).
Java 7 était la version par défaut à télécharger sur java.com d'avril 2012 jusqu'à la sortie de Java 8.
Mises à jour de Java 7
Oracle a publié des mises à jour publiques de la famille Java 7 sur une base trimestrielle jusqu'en avril 2015, date à laquelle le produit a atteint la fin de sa disponibilité publique. Les mises à jour ultérieures pour JDK 7, qui se sont poursuivies jusqu'en juillet 2022, ne sont mises à disposition que pour les clients disposant d'un contrat de support.
Java SE 8
Java 8 est sorti le 18 mars 2014, et comprenait certaines fonctionnalités qui étaient prévues pour Java 7 mais qui ont été ultérieurement reportées.
Les travaux sur les fonctionnalités ont été organisés en termes de propositions d'amélioration du JDK (JEP).
- JSR 335, JEP 126 : Prise en charge au niveau du langage des expressions lambda (officiellement, expressions lambda ; officieusement, fermetures ) sous Project Lambda et des méthodes par défaut ( méthodes d'extension virtuelles ) qui peuvent être utilisées pour ajouter des méthodes aux interfaces sans casser les implémentations existantes. Un débat était en cours dans la communauté Java sur l'opportunité d'ajouter la prise en charge des expressions lambda. Sun a déclaré plus tard que les expressions lambda seraient incluses dans Java et a demandé l'avis de la communauté pour affiner la fonctionnalité. La prise en charge des expressions lambda permet également des opérations de style fonctionnel sur des flux d'éléments, telles que les transformations inspirées de MapReduce sur des collections. Les méthodes par défaut peuvent être utilisées par un auteur d'API pour ajouter de nouvelles méthodes à une interface sans casser l'ancien code qui l'utilise. Bien que ce ne soit pas leur intention première, les méthodes par défaut peuvent également être utilisées pour l'héritage multiple de comportement (mais pas d'état).
- JEP 174 : Projet Nashorn, un environnement d'exécution JavaScript qui peut exécuter du code JavaScript intégré dans des applications
- JEP 104 : Annotation sur les types Java
- Arithmétique des entiers non signés
- JEP 120 : Annotations répétitives
- JEP 150 : API de date et d'heure
- JEP 178 : Bibliothèques JNI liées statiquement
- JEP 153 : Lancer des applications JavaFX (lancement direct des fichiers JAR d'application JavaFX)
- JEP 122 : Supprimer la génération permanente
Java 8 n'est pas pris en charge sur Windows XP mais depuis la mise à jour 25 du JDK 8, il peut toujours être installé et exécuté sous Windows XP. Les mises à jour précédentes du JDK 8 pouvaient être exécutées sous XP en téléchargeant le fichier au format zip archivé et en le décompressant pour obtenir l'exécutable. La dernière version de Java 8 pouvant fonctionner sur XP est la mise à jour 251.
Depuis octobre 2014, Java 8 est la version par défaut à télécharger (et à nouveau le téléchargement remplaçant Java 9) à partir du site officiel. « Oracle continuera à fournir des mises à jour publiques et des mises à jour automatiques de Java SE 8, indéfiniment pour les utilisateurs personnels ».
Mises à jour de Java 8
Java SE 9
Java SE 9 a été mis à disposition le 21 septembre 2017 en raison de l'acceptation controversée de l'implémentation actuelle du projet Jigsaw par le comité exécutif de Java ce qui a conduit Oracle à résoudre certains problèmes et préoccupations en suspens et à affiner certaines questions techniques critiques. Dans les derniers jours de juin 2017, le processus communautaire Java a exprimé un consensus presque unanime sur le schéma de système de modules proposé.
- JSR 376 : Modularisation du JDK sous le projet Jigsaw ( Java Platform Module System )
- JavaDB a été supprimé du JDK
- JEP 193 : Poignées de variables, définissez un moyen standard pour invoquer les équivalents de
java.util.concurrent.atomicdiversessun.misc.Unsafeopérations - JEP 213 : Projet Milling Coin, autoriser @SafeVarargs sur les méthodes d'instance privées ; autoriser l'utilisation de variables effectivement finales comme ressources dans l'instruction try-with-resources ; autoriser le losange avec des classes anonymes si le type d'argument du type inféré est dénotable ; terminer la suppression, commencée dans Java SE 8, du trait de soulignement de l'ensemble des noms d'identifiants légaux ; prise en charge des méthodes privées dans les interfaces
- JEP 222 : jshell : le shell Java (boucle de lecture-évaluation-impression) : JShell est une interface de ligne de commande REPL pour le langage Java.
- JEP 254 : Cordes compactes
- JEP 263 : Graphiques HiDPI : mise à l'échelle et dimensionnement automatiques
- JEP 266 : Plus de mises à jour de concurrence, il inclut une implémentation Java de Reactive Streams , y compris une nouvelle
Flowclasse qui incluait les interfaces précédemment fournies par Reactive Streams - JEP 268 : Catalogues XML
- JEP 282 : jlink : le Java Linker, crée un outil qui peut assembler et optimiser un ensemble de modules et leurs dépendances dans une image d'exécution personnalisée. Il permet de produire un exécutable entièrement utilisable, y compris la JVM pour l'exécuter
- JEP 295 : Compilation anticipée, compilation anticipée fournie par GraalVM
La première version candidate de Java 9 a été publiée le 9 août 2017. La première version stable de Java 9 est sortie le 21 septembre 2017.
Histoire
Lors de JavaOne 2011, Oracle a discuté des fonctionnalités qu'ils espéraient publier pour Java 9 en 2016. Java 9 devrait inclure une meilleure prise en charge des tas de plusieurs gigaoctets, une meilleure intégration du code natif, un récupérateur de mémoire par défaut différent ( G1 , pour des « temps de réponse plus courts ») et une JVM auto-ajustable . Début 2016, la sortie de Java 9 a été reprogrammée pour mars 2017 et a ensuite été repoussée de quatre mois supplémentaires à juillet 2017.
Mises à jour de Java 9
Java SE 10
OpenJDK 10 a été publié le 20 mars 2018, avec douze nouvelles fonctionnalités confirmées. Parmi ces fonctionnalités, on trouve :
- JEP 286 : Inférence de type de variable locale
- JEP 296 : Consolider la forêt JDK dans un référentiel unique
- JEP 304 : Interface du récupérateur de place
- JEP 307 : GC parallèle complet pour G1
- JEP 310 : Classe d'application - Partage de données
- JEP 312 : Échanges de contacts locaux entre threads
- JEP 313 : Supprimer l'outil de génération d'en-tête natif (javah)
- JEP 314 : Extensions de balises de langue Unicode supplémentaires
- JEP 316 : Allocation de tas sur des périphériques de mémoire alternatifs
- JEP 317 : Compilateur JIT expérimental basé sur Java
- JEP 319 : Certificats racines
- JEP 322 : Versionnage basé sur le temps
La première de ces JEP 286 Local-Variable Type Inference permet vard'utiliser le mot-clé pour les variables locales avec le type réel calculé par le compilateur. Grâce à ce changement, les développeurs peuvent effectuer les opérations suivantes au lieu de spécifier manuellement le type de la variable :
var list = new ArrayList < String > (); // déduit ArrayList<String> var stream = list . stream (); // déduit Stream<String>
Mises à jour de Java 10
Java SE 11
JDK 11 a été publié le 25 septembre 2018 et la version est actuellement ouverte aux corrections de bugs. Elle offre un support à long terme (LTS) . Entre autres, Java 11 inclut un certain nombre de nouvelles fonctionnalités, telles que :
- JEP 181 : Contrôle d'accès basé sur Nest
- JEP 309 : Constantes de fichiers de classe dynamiques
- JEP 315 : Améliorer les intrinsèques d'Aarch64
- JEP 318 : Epsilon : un récupérateur de mémoire sans opération
- JEP 320 : Supprimer les modules Java EE et CORBA
- JEP 321 : Client HTTP (standard)
- JEP 323 : Syntaxe des variables locales pour les paramètres Lambda
- JEP 324 : Accord de clé avec Curve25519 et Curve448
- JEP 327 : Unicode 10
- JEP 328 : Enregistreur de vol
- JEP 329 : Algorithmes cryptographiques ChaCha20 et Poly1305
- JEP 330 : Lancer des programmes à code source à fichier unique
- JEP 331 : Profilage de tas à faible surcharge
- JEP 332 : Sécurité de la couche transport (TLS) 1.3
- JEP 333 : ZGC : un récupérateur de mémoire évolutif à faible latence (expérimental)
- JEP 335 : déprécier le moteur JavaScript Nashorn
- JEP 336 : Suppression des outils et de l'API Pack200
Un certain nombre de fonctionnalités des versions précédentes ont été abandonnées ; en particulier, les applets Java et Java Web Start ne sont plus disponibles. Les modules JavaFX , Java EE et CORBA ont été supprimés du JDK.
Mises à jour de Java 11
Java SE 12
JDK 12 est sorti le 19 mars 2019. Java 12 inclut notamment un certain nombre de nouvelles fonctionnalités, telles que :
- JEP 189 : Shenandoah : un récupérateur de mémoire à faible temps de pause (expérimental)
- JEP 230 : Suite de micro-évaluation
- JEP 325 : Expressions de commutation (aperçu)
- JEP 334 : API des constantes JVM
- JEP 340 : Un port AArch64, pas deux
- JEP 341 : Archives CDS par défaut
- JEP 344 : Collections mixtes avortables pour G1
- JEP 346 : Renvoyer rapidement la mémoire dédiée inutilisée de G1
La fonctionnalité d'aperçu JEP 325 étend l' switchinstruction afin qu'elle puisse également être utilisée comme expression et ajoute une nouvelle forme d'étiquette de cas où le côté droit est une expression. Aucune instruction break n'est nécessaire. Pour les expressions complexes, une yieldinstruction peut être utilisée. Cela devient la norme dans Java SE 14.
int ndays = switch ( mois ) { case JAN , MAR , MAI , JUIL , AOÛT , OCT , DÉC -> 31 ; case AVR , JUIN , SEP , NOV -> 30 ; case FÉV -> { if ( année % 400 == 0 ) rendement 29 ; else if ( année % 100 == 0 ) rendement 28 ; else if ( année % 4 == 0 ) rendement 29 ; else rendement 28 ; } };
Mises à jour de Java 12
Java SE 13
JDK 13 est sorti le 17 septembre 2019. Java 13 inclut les nouvelles fonctionnalités suivantes, ainsi que « des centaines d'améliorations mineures et des milliers de corrections de bugs ».
- JEP 350 : Archives CDS dynamiques
- JEP 351 : ZGC : annuler la validation de la mémoire inutilisée
- JEP 353 : Réimplémenter l'API de socket héritée
- JEP 354 : Expressions de commutation (aperçu)
- JEP 355 : Blocs de texte (aperçu)
Les blocs de texte JEP 355 autorisent les littéraux de chaîne multilignes :
Chaîne html = <html lang="fr"> <body> <p>Bonjour tout le monde</p> </body> </html> ;
Mises à jour de Java 13
Java SE 14
JDK 14 est sorti le 17 mars 2020. Java 14 inclut les nouvelles fonctionnalités suivantes, ainsi que « des centaines d'améliorations mineures et des milliers de corrections de bugs ».
- JEP 305 : Recherche de motifs pour instanceof (aperçu)
- JEP 343 : Outil de packaging (Incubateur)
- JEP 345 : Allocation de mémoire compatible NUMA pour G1
- JEP 349 : Diffusion en continu de l'événement JFR
- JEP 352 : tampons d'octets mappés non volatils
- JEP 358 : NullPointerExceptions utiles
- JEP 359 : Enregistrements (Aperçu)
- JEP 361 : Expressions de commutation (standard)
- JEP 362 : abandon des ports Solaris et SPARC
- JEP 363 : Suppression du récupérateur de mémoire Concurrent Mark Sweep (CMS)
- JEP 364 : ZGC sur macOS
- JEP 365 : ZGC sous Windows
- JEP 366 : abandon de la combinaison ParallelScavenge + SerialOld GC
- JEP 367 : Supprimer les outils et l'API Pack200
- JEP 368 : Blocs de texte (deuxième aperçu)
- JEP 370 : API d'accès à la mémoire étrangère (incubateur)
JEP 305, Pattern Matching pour instanceof simplifie le cas courant d'un instanceoftest immédiatement suivi par cast, remplaçant
si ( obj instanceof String ) { String s = ( String ) obj ; System . out . println ( s . length ()); }
avec
si ( obj instanceof String s ) { System . out . println ( s . length ()); }
JEP 359 Records permet la création facile de classes simples et immuables de type Tuple .
enregistrement Point ( int x , int y ) { } Point p = nouveau Point ( 3 , 4 ); System . out . println ( p . x ());
Mises à jour de Java 14
Java SE 15
Le JDK 15 est sorti le 15 septembre 2020. Java 15 ajoute par exemple la prise en charge des littéraux de chaîne multilignes (alias blocs de texte). Les récupérateurs de mémoire Shenandoah et Z (ce dernier parfois abrégé en ZGC) sont désormais prêts à être utilisés en production (c'est-à-dire qu'ils ne sont plus marqués comme expérimentaux). La prise en charge du système d'exploitation Solaris d'Oracle (et des processeurs SPARC) est abandonnée (tout en restant disponible dans Java 11 par exemple). Le moteur JavaScript Nashorn est supprimé. Certains certificats d'autorité de certification racine ont également été supprimés .
- JEP 339 : Algorithme de signature numérique à courbe d'Edwards (EdDSA)
- JEP 360 : Classes fermées (aperçu)
- JEP 371 : Classes cachées
- JEP 372 : Supprimer le moteur JavaScript Nashorn
- JEP 373 : Réimplémenter l'API DatagramSocket héritée
- JEP 374 : Désactiver et abandonner le verrouillage biaisé
- JEP 375 : Recherche de motifs pour instanceof (deuxième aperçu)
- JEP 377 : ZGC : un récupérateur de mémoire évolutif à faible latence
- JEP 378 : Blocs de texte
- JEP 379 : Shenandoah : un récupérateur de mémoire à faible temps de pause
- JEP 381 : Supprimer les ports Solaris et SPARC
- JEP 383 : API d'accès à la mémoire étrangère (deuxième incubateur)
- JEP 384 : Les archives (deuxième aperçu)
- JEP 385 : Supprimer l'activation RMI pour suppression
JEP 360 Sealed Classes ajoute des classes et des interfaces scellées qui limitent les autres classes ou interfaces qui peuvent les étendre ou les implémenter. Seules les classes spécifiées dans une permitsclause peuvent étendre la classe ou l'interface.
paquet com.example.geometry ; classe publique abstraite scellée Forme autorisée Cercle , Rectangle , Carré {...}
Avec les enregistrements, les classes scellées sont des types de somme . Elles fonctionnent bien avec d'autres fonctionnalités récentes telles que les enregistrements, les expressions de commutation et la correspondance de motifs pour instance-of. Elles font toutes partie d'un système de « correspondance de motifs en Java » présenté pour la première fois par Gavin Bierman et Brian Goetz, en septembre 2018.
Mises à jour Java 15
Java SE 16
JDK 16 est sorti le 16 mars 2021. Java 16 supprime les options de compilation Ahead-of-Time (et Graal JIT ). L'implémentation Java elle-même était et est toujours écrite en C++ , tandis qu'à partir de Java 16, le C++14 plus récent (mais toujours pas par exemple C++17 ou C++20 ) est autorisé. Le code a également été déplacé vers GitHub , abandonnant Mercurial comme système de contrôle de source .
- JEP 338 : API vectorielle (incubateur)
- JEP 347 : Activation des fonctionnalités du langage C++14
- JEP 357 : Migrer de Mercurial vers Git
- JEP 369 : Migrer vers GitHub
- JEP 376 : ZGC : traitement simultané de la pile de threads
- JEP 380 : Canaux de socket du domaine Unix
- JEP 386 : Alpine Linux Port – pas encore stable
- JEP 387 : Méta-espace élastique
- JEP 388 : Portage Windows/AArch64
- JEP 389 : API Foreign Linker (Incubateur)
- JEP 390 : Avertissements pour les classes basées sur la valeur
- JEP 392 : Outil d'emballage
- JEP 393 : API d'accès à la mémoire étrangère (troisième incubateur)
- JEP 394 : Recherche de modèles pour instanceof
- JEP 395 : Dossiers
- JEP 396 : encapsuler fortement les composants internes du JDK par défaut
- JEP 397 : Classes fermées (deuxième aperçu)
Mises à jour Java 16
Java SE 17
JDK 17 est sorti en septembre 2021. Java 17 est la deuxième version de support à long terme (LTS) depuis le passage à la nouvelle cadence de publication de 6 mois (la première étant Java 11).
- JEP 306 : Restaurer la sémantique toujours stricte des nombres à virgule flottante
- JEP 356 : Générateurs de nombres pseudo-aléatoires améliorés
- JEP 382 : Nouveau pipeline de rendu macOS
- JEP 391 : Portage macOS/AArch64
- JEP 398 : désapprouver l'API Applet pour suppression
- JEP 403 : Encapsuler fortement les composants internes du JDK
- JEP 406 : Recherche de correspondance de modèles pour les commutateurs (aperçu)
- JEP 407 : Supprimer l'activation RMI
- JEP 409 : Classes fermées
- JEP 410 : Supprimer le compilateur expérimental AOT et JIT
- JEP 411 : Déconseiller le gestionnaire de sécurité pour suppression
- JEP 412 : Fonctions étrangères et API de mémoire (Incubateur)
- JEP 414 : API vectorielle (deuxième incubateur)
- JEP 415 : Filtres de désérialisation spécifiques au contexte
La norme JEP 406 étend la syntaxe de correspondance de modèles utilisée dans les opérations instanceof aux instructions et expressions switch. Elle permet de sélectionner des cas en fonction du type de l'argument, des cas nuls et des modèles de raffinement
Objet o = ...; return switch ( o ) { case null -> "Null" ; case String s -> "String %s" . formatted ( s ); case Long l -> "long %d" . formatted ( l ); case Double d -> "double %f" . formatted ( d ); case Integer i && i > 0 // raffinement des modèles -> "int positif %d" . formatted ( i ); case Integer i && i == 0 -> "int zéro %d" . formatted ( i ); case Integer i && i < 0 -> "int négatif %d" . formatted ( i ); default -> o . toString (); };
Mises à jour Java 17
Java SE 18
Le JDK 18 est sorti le 22 mars 2022.
- JEP 400 : UTF-8 par défaut
- JEP 408 : Serveur Web simple
- JEP 413 : Extraits de code dans la documentation de l'API Java
- JEP 416 : Réimplémenter la réflexion de base avec des handles de méthode
- JEP 417 : API vectorielle (troisième incubateur)
- JEP 418 : Résolution d'adresse Internet SPI
- JEP 419 : Fonctions étrangères et API de mémoire (Deuxième incubateur)
- JEP 420 : Recherche de motifs pour les commutateurs (deuxième aperçu)
- JEP 421 : Déconseiller la finalisation pour suppression
Mises à jour Java 18
Java SE 19
JDK 19 was released on 20 September 2022.
- 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)
JEP 405 allows record patterns, extending the pattern matching capabilities of instanceof operators, and switch expressions, to include record patterns that explicitly refer to the components of the record.
record Rectangle(intx,inty,intw,inth){} intarea(Objecto){ if(oinstanceofRectangle(intx,inty,intw,inth)){ returnw*h; } return0; }
Such patterns can include nested patterns, where the components of records are themselves records, allowing patterns to match more object graphs.
Java 19 updates
Java SE 20
Java 20 was released on 21 March 2023. All JEPs were either incubators or previews.
- JEP 429: Scoped Values (Incubator)
- JEP 432: Record Patterns (Second Preview)
- JEP 433: Pattern Matching for switch (Fourth Preview)
- JEP 434: Foreign Function & Memory API (Second Preview)
- JEP 436: Virtual Threads (Second Preview)
- JEP 437: Structured Concurrency (Second Incubator)
- JEP 438: Vector API (Fifth Incubator)
Java 20 updates
Java SE 21
Java 21 was released on 19 September 2023. The 32-bit version of Java for Windows on x86 was deprecated for removal with this release. The following JEPs were added, including eight JEPs that graduated from the incubating and preview stages, compared to Java 20 which only had previewing and incubating JEPs. Java 21 introduces features first previewed in Java 17 (pattern matching for switch statements) and Java 19 (record patterns). All JEPs added with Java 21 include the following:
- JEP 430: String Templates (Preview)
- JEP 431: Sequenced Collections
- JEP 439: Generational ZGC
- JEP 440: Record Patterns
- JEP 441: Pattern Matching for switch
- JEP 442: Foreign Function & Memory API (Third Preview)
- JEP 443: Unnamed Patterns and Variables (Preview)
- JEP 444: Virtual Threads
- JEP 445: Unnamed Classes and Instance Main Methods (Preview)
- JEP 446: Scoped Values (Preview)
- JEP 448: Vector API (Sixth Incubator)
- JEP 449: Deprecate the Windows 32-bit x86 Port for Removal
- JEP 451: Prepare to Disallow the Dynamic Loading of Agents
- JEP 452: Key Encapsulation Mechanism API
- JEP 453: Structured Concurrency (Preview)
JEP 445, previewing unnamed classes, allows for a barebones Main class without boilerplate code:
voidmain(){ System.out.println("Hello, World!"); }
instead of :
publicclass HelloWorld{ publicstaticvoidmain(String[]args){ System.out.println("Hello, World!"); } }
Java 21 updates
Java SE 22
Java 22 was released on March 19, 2024. The following features, or JEPs, were added with this release:
- JEP 423: Region Pinning for G1
- JEP 447: Statements before super(...) (Preview)
- JEP 454: Foreign Function & Memory API
- JEP 456: Unnamed Variables & Patterns
- JEP 457: Class-File API (Preview)
- JEP 458: Launch Multi-File Source-Code Programs
- JEP 459: String Templates (Second Preview)
- JEP 460: Vector API (Seventh Incubator)
- JEP 461: Stream Gatherers (Preview)
- JEP 462: Structured Concurrency (Second Preview)
- JEP 463: Implicitly Declared Classes and Instance Main Methods (Second Preview)
- JEP 464: Scoped Values (Second Preview)
An API related to Java's threading implementation, java.lang.Thread.countStackFrames, was removed.
Java SE 23
Java 23 was released on September 17, 2024, with the following JEPs:
- JEP 455: Primitive Types in Patterns, instanceof, and switch (Preview)
- JEP 466: Class-File API (Second Preview)
- JEP 467: Markdown Documentation Comments
- JEP 469: Vector API (Eighth Incubator)
- JEP 473: Stream Gatherers (Second Preview)
- JEP 471: Deprecate the Memory-Access Methods in sun.misc.Unsafe for Removal
- JEP 474: ZGC: Generational Mode by Default
- JEP 476: Module Import Declarations (Preview)
- JEP 477: Implicitly Declared Classes and Instance Main Methods (Third Preview)
- JEP 480: Structured Concurrency (Third Preview)
- JEP 481: Scoped Values (Third Preview)
- JEP 482: Flexible Constructor Bodies (Second Preview)
The String Templates preview feature was removed in Java 23 due to issues with the design of the feature.
Java SE 24
As of November 2024, the specification for Java 24 has not yet been finalized. Java 24 is scheduled for release in March 2025.
The following JEPs have been proposed for this release but have not yet been confirmed and are still in their review period:
- JEP 496: Quantum-Resistant Module-Lattice-Based Key Encapsulation Mechanism
- JEP 497: Quantum-Resistant Module-Lattice-Based Digital Signature Algorithm
The following JEPs have been targeted to this release of Java SE:
- JEP 404: Generational Shenandoah (Experimental)
- JEP 450: Compact Object Headers (Experimental) (formerly known as Project Lilliput)
- JEP 472: Prepare to Restrict the Use of JNI
- JEP 475: Late Barrier Expansion for G1
- JEP 478: Key Derivation Function API (Preview)
- JEP 479: Remove the Windows 32-bit x86 Port
- JEP 483: Ahead-of-Time Class Loading & Linking
- JEP 484: Class-File API
- JEP 485: Stream Gatherers
- JEP 486: Permanently Disable the Security Manager
- JEP 487: Scoped Values (Fourth Preview)
- JEP 488: Primitive Types in Patterns, instanceof, and switch (Second Preview)
- JEP 489: Vector API (Ninth Incubator)
- JEP 490: ZGC: Remove the Non-Generational Mode
- JEP 491: Synchronize Virtual Threads without Pinning
- JEP 492: Flexible Constructor Bodies (Third Preview)
- JEP 493: Linking Run-Time Images without JMODs
- JEP 494: Module Import Declarations (Second Preview)
- JEP 495: Simple Source Files and Instance Main Methods (Fourth Preview)
Java SE 25
As of December 2024, the specification for Java 25 has not yet been finalized. Java 25 is scheduled for release in September 2025.
Future features
- Project Valhalla: Value classes, whose objects lack identity, but can in certain cases get an improved memory layout (with less indirection), or have their allocation optimized away entirely.
- Project Panama:
- Improved interoperability with native code, to enable Java source code to call functions and use data types from other languages, in a way that is easier and has better performance than today (this part of Project Panama is getting stabilized in Java 22 under JEP 454: Foreign Function & Memory API).
- Vector API, a portable and relatively low-level abstraction layer for SIMD programming. Its stabilization is dependent on Project Valhalla.
- Project Lilliput: Reduce the size of Java object headers. First down to 64 bits, and then down to 32 bits.
- Reducing startup time and warm-up time (time to peak performance) in JIT mode:
- Project CRaC enables making snapshots of whole JVM (together with the running application) and restoring it with necessary adjustments (reopening files, sockets, etc).
- Project Leyden, among other things, will allow partial or (in the long term) full AOT compiling, reducing overall dynamism (by adopting so called "closed-world constraints") to reduce dynamic compiling overhead.
- Project Babylon aims to extend the Java language's reach to alternative programming models with an enhancement to its reflective programming abilities, called code reflection (i.e., reflection over code itself). The stated main goal is to run Java code on GPUs, with SQL and other programming models as secondary targets.
Implementations
The officially supported Java platform, first developed at Sun and now stewarded by Oracle, is Java SE. Releases are based on the OpenJDK project, a free and open-source project with an open development model. Other Java implementations exist, however—in part due to Java's early history as proprietary software. In contrast, some implementations were created to offer some benefits over the standard implementation, often the result of some area of academic or corporate-sponsored research. Many Linux distributions include builds of OpenJDK through the IcedTea project started by Red Hat, which provides a more straightforward build and integration environment.
Visual J++ and the Microsoft Java Virtual Machine were created as incompatible implementations. After the Sun v. Microsoft lawsuit, Microsoft abandoned it and began work on the .NET platform. In 2021, Microsoft started distributing compatible "Microsoft Build of OpenJDK" for Java 11 first then also for Java 17. Their builds support not only Windows, but also Linux and macOS.
Other proprietary Java implementations are available, such as Azul's Zing. Azul offers certified open source OpenJDK builds under the Zulu moniker.
Prior to the release of OpenJDK, while Sun's implementation was still proprietary, the GNU Classpath project was created to provide a free and open-source implementation of the Java platform. Since the release of JDK 7, when OpenJDK became the official reference implementation, the original motivation for the GNU Classpath project almost completely disappeared, and its last release was in 2012.
The Apache Harmony project was started shortly before the release of OpenJDK. After Sun's initial source code release, the Harmony project continued, working to provide an implementation under a lax license, in contrast to the protective license chosen for OpenJDK. Google later developed Android and released it under a lax license. Android incorporated parts of the Harmony project, supplemented with Google's own Dalvik virtual machine and ART. Apache Harmony has since been retired, and Google has switched its Harmony components with equivalent ones from OpenJDK.
Both Jikes and Jikes RVM are open-source research projects that IBM developed.
Several other implementations exist that started as proprietary software but are now open source. IBM initially developed OpenJ9 as the proprietary J9 but has since relicensed the project and donated it to the Eclipse Foundation. JRockit is a proprietary implementation that was acquired by Oracle and incorporated into subsequent OpenJDK versions.