{"id":979,"date":"2020-01-16T17:53:36","date_gmt":"2020-01-16T16:53:36","guid":{"rendered":"http:\/\/www.loicmathieu.fr\/wordpress\/?p=979"},"modified":"2020-05-06T09:49:22","modified_gmt":"2020-05-06T07:49:22","slug":"java-14-quoi-de-neuf","status":"publish","type":"post","link":"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-14-quoi-de-neuf\/","title":{"rendered":"Java 14 : what&#8217;s new ?"},"content":{"rendered":"<p>Now that Java 14 is features complete (Rampdown Phase One at the day of writing), it\u2019s time to walk throught all it\u2019s functionalities that brings to us, developers, this new version.<\/p>\n<p>This article is part of a series on what\u2019s new on the last versions of Java, for those who wants to read the others, here are the links : <a href=\"http:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-13-quoi-de-neuf\/\">Java 13<\/a>, <a href=\"http:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-12-quoi-de-neuf\/\">Java 12<\/a>, <a href=\"http:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-11-quoi-de-neuf\/\">Java 11<\/a>,\u00a0<a href=\"http:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-10-quoi-de-neuf\/\">Java 10,<\/a> and <a href=\"http:\/\/www.loicmathieu.fr\/wordpress\/informatique\/les-nouveautes-de-java-9-pour-les-developeurs\/\">Java 9<\/a>.<\/p>\n<p>As opposite to the previous Java versions, the version 14 brings a lot of functionalities, according to me, it&#8217;s a version that we can qualify major like Java 5 or 8 ! Records, Pattern Matching, Switch Expression, Text Block, &#8230; A lot of good stuff in this version ;)<\/p>\n<h2>JEP 361: Switch Expressions (Standard)<\/h2>\n<p>Switch Expressions goes out of preview and becomes a standard functionality !<\/p>\n<p>The new keyword <strong>yield<\/strong> has been validated.<\/p>\n<p>More info in the JEP: <a href=\"https:\/\/openjdk.java.net\/jeps\/361\"><a href=\"https:\/\/openjdk.java.net\/jeps\/361\">https:\/\/openjdk.java.net\/jeps\/361<\/a><\/a><\/p>\n<p>If you had missed this functionality in the previous versions, here is an article that describe it in details: <a href=\"https:\/\/blog.codefx.org\/java\/switch-expressions\/\">Definitive Guide To Switch Expressions<\/a><\/p>\n<h2>JEP 368: Text Blocks (Second Preview)<\/h2>\n<p><strong>Text Blocks<\/strong> : the possibility to write <em>String Literals<\/em> on multiple lines is still in preview, with the addition of two new <em>escape sequence<\/em> : <code>'\\'<\/code> and <code>'\\s'<\/code>.<\/p>\n<p><code>'\\'<\/code> allows to write on multiple lines a String that must be write on a single line (like in shell).<\/p>\n<pre>String text = \"\"\"\n                Lorem \\\n                ipsum \\\n                dolor \\\n                \"\"\";\nSystem.out.println(text); \/\/ Lorem impsum dolor\n<\/pre>\n<p><code>'\\s'<\/code> allow to add a space (\\u0020)<\/p>\n<pre>String colors = \"\"\"\n    red  \\s\n    green\\s\n    blue \\s\n    \"\"\";\n<\/pre>\n<p>More info in the JEP:<a href=\"https:\/\/openjdk.java.net\/jeps\/368\"> <a href=\"https:\/\/openjdk.java.net\/jeps\/368\">https:\/\/openjdk.java.net\/jeps\/368<\/a><\/a>\nIf you had missed this functionality, it is described in my article on <a href=\"http:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-13-quoi-de-neuf\/\">Java 13<\/a>.<\/p>\n<h2>JEP 358: Helpful NullPointerExceptions<\/h2>\n<p><strong>NullPointerException<\/strong>s\u00a0(NPE) are very common on Java, and the error message is often not very useful as it only points to the line in which the exception occurs, and not exactly on the instruction \/ code part that generates this exception.<\/p>\n<p>SAP implemented in it&#8217;s own JVM (since 2006!) an enhanced version of the messages of the NPE. With this experience, the implementation has been enhanced inside OpenJDK. To my great regret, we need to add an option to the command line, <code>-XX:+ShowCodeDetailsInExceptionMessages<\/code>, to enable this usefull feature.<\/p>\n<p>For comparison, here are the standard error messages for <strong>NullPointerException<\/strong>.\nYou can see that we didn&#8217;t know which object is null: a ? a.s ?<\/p>\n<pre>$ jshell\n|  Welcome to JShell -- Version 14-ea\n|  For an introduction type: \/help intro\n\njshell&gt; public class A { public String s;}\n|  created class A\n\njshell&gt; A a;\na ==&gt; null\n\njshell&gt; a.s.toString()\n|  Exception java.lang.NullPointerException\n|        at (#3:1)\n\njshell&gt; a.s = \"toto\";\n|  Exception java.lang.NullPointerException\n|        at (#4:1)\n\njshell&gt; a = new A();\na ==&gt; A@3f8f9dd6\n\njshell&gt; a.s.toString()\n|  Exception java.lang.NullPointerException\n|        at (#6:1)\n\njshell&gt; \n<\/pre>\n<p>Executing the same lines but with useful NPE enabled will give us precisely which object is null, and which operation generated a NPE on this object (read, write, method call).<\/p>\n<pre>$ jshell -R-XX:+ShowCodeDetailsInExceptionMessages\n|  Welcome to JShell -- Version 14-ea\n|  For an introduction type: \/help intro\n\njshell&gt; public class A { public String s;}\n|  created class A\n\njshell&gt; A a;\na ==&gt; null\n\njshell&gt; a.s.toString()\n|  Exception java.lang.NullPointerException: Cannot read field \"s\" because \"REPL.$JShell$12.a\" is null\n|        at (#3:1)\n\njshell&gt; a.s = \"toto\";\n|  Exception java.lang.NullPointerException: Cannot assign field \"s\" because \"REPL.$JShell$12.a\" is null\n|        at (#4:1)\n\njshell&gt; a = new A();\na ==&gt; A@3f8f9dd6\n\njshell&gt; a.s.toString()\n|  Exception java.lang.NullPointerException: Cannot invoke \"String.toString()\" because \"REPL.$JShell$12.a.s\" is null\n|        at (#6:1)\n\njshell&gt;\n<\/pre>\n<p>More info in the JEP : <a href=\"https:\/\/openjdk.java.net\/jeps\/358\"><a href=\"https:\/\/openjdk.java.net\/jeps\/358\">https:\/\/openjdk.java.net\/jeps\/358<\/a><\/a><\/p>\n<h2>JEP 359: Records (Preview)<\/h2>\n<p>Stating the JEP : Records provides a compact syntax for declaring classes which are transparent holders for shallowly immutable data.<\/p>\n<p>This is a new Java type (like class and enum), it&#8217;s purpose is to be a data carrier class. Records are implicitly final and cannot be abstract.<\/p>\n<p>Records will provides default implementation for boilerplate code that you would otherwise have your IDE generated.<\/p>\n<pre>jshell&gt; record Point(int x, int y) { }\n\njshell&gt; Point p = new Point(); \/\/ all fields need to be initialized at construction time\n|  Error:\n|  constructor Point in record Point cannot be applied to given types;\n|    required: int,int\n|    found:    no arguments\n|    reason: actual and formal argument lists differ in length\n|  Point p = new Point();\n|            ^---------^\n\njshell&gt; Point p = new Point(1, 1);\np ==&gt; Point[x=1, y=1]\n<\/pre>\n<p>All records have public accessors (but the fields are private) and a toString method<\/p>\n<pre>jshell&gt; p.x \/\/field is private\n|  Error:\n|  x has private access in Point\n|  p.x\n|  ^-^\n\njshell&gt; p.x(); \/\/public accessor\n$8 ==&gt; 1\n\njshell&gt; p.toString(); \/\/default toString()\n$9 ==&gt; \"Point[x=1, y=1]\"\n<\/pre>\n<p>All records have <code>equals<\/code> and <code>hashCode<\/code> methods whose implementations are based on the record type and state.<\/p>\n<pre>jshell&gt; Point other = new Point(1,1);\nother ==&gt; Point[x=1, y=1]\n\njshell&gt; other.equals(p);\n$11 ==&gt; true\n\njshell&gt; other == p\n$12 ==&gt; false\n<\/pre>\n<p>You can override the default methods and constructor of a record.<\/p>\n<p>When overriding the default constructor, there is no need to repeat the field initialization and you can directly access the fields of the record.<\/p>\n<pre>record Range(int lo, int hi) {\n  public Range {\n    if (lo &gt; hi)  \/* referring here to the implicit constructor parameters *\/\n      throw new IllegalArgumentException(String.format(\"(%d,%d)\", lo, hi));\n  }\n}\n<\/pre>\n<p>More info in the JEP :<a href=\"https:\/\/openjdk.java.net\/jeps\/359\"> <a href=\"https:\/\/openjdk.java.net\/jeps\/359\">https:\/\/openjdk.java.net\/jeps\/359<\/a><\/a><\/p>\n<h2>JEP 305: Pattern Matching for instanceof (Preview)<\/h2>\n<p>Every developer already wrote code that looks like this with the <strong>instanceof<\/strong> operator:<\/p>\n<pre>if (obj instanceof Integer) {\n    int intValue = ((Integer) obj).intValue();\n    \/\/ use intValue\n}\n<\/pre>\n<p>The cast after the <strong>instanceof<\/strong> looks unnecessary as we just tested the type of the object.\nThis is where <em>pattern matching <\/em> comes into play, it will allow to verify that an object is on some type (like <strong>instanceof<\/strong>) and &#8220;<em>extract<\/em>&#8221; the &#8216;<em>shape<\/em>&#8221; of the object in a new variable.\nUsing pattern matching, we will be able to replace the previous code with this one<\/p>\n<pre>if (obj instanceof Integer intValue) {\n    \/\/ use intValue\n}\n<\/pre>\n<p>No more <em>cast<\/em> needed, and we assign the object in a local variable on the type validated by the <strong>instanceof<\/strong>.\nTo use <em>pattern matching<\/em>, we need to add the command line flag <code>--enable-preview<\/code> as this is a preview features.<\/p>\n<p>Here is a more complete example via JSHell.<\/p>\n<pre>$ jshell --enable-preview\n|  Welcome to JShell -- Version 14-ea\n|  For an introduction type: \/help intro\n\njshell&gt; public void print(Object o) {\n   ...&gt; if(o instanceof String s) System.out.println(\"String =&gt;\" + s);\n   ...&gt; if(o instanceof Integer i) System.out.println(\"Integer =&gt;\" + i);\n   ...&gt; }\n|  created method print(Object)\n\njshell&gt; print(1)\nInteger =&gt;1\n\njshell&gt; print(\"toto\")\nString =&gt;toto\n\n<\/pre>\n<p>More info in the JEP: <a href=\"https:\/\/openjdk.java.net\/jeps\/305\"><a href=\"https:\/\/openjdk.java.net\/jeps\/305\">https:\/\/openjdk.java.net\/jeps\/305<\/a><\/a><\/p>\n<p>Brian Goetz wrote an article that covers more <em>Pattern Matching<\/em> buildings and that prelude to what might happen in future versions of Java on the subject: <a href=\"https:\/\/cr.openjdk.java.net\/~briangoetz\/amber\/pattern-match.html\"><a href=\"https:\/\/cr.openjdk.java.net\/~briangoetz\/amber\/pattern-match.html\">https:\/\/cr.openjdk.java.net\/~briangoetz\/amber\/pattern-match.html<\/a><\/a><\/p>\n<h2>Miscellaneous<\/h2>\n<ul><li>JDK-8229485 : Add StrictMath::decrementExact, StrictMath::incrementExact and StrictMath::negateExact()<\/li>\n\n<li>JDK-8232633 : Support for pluralization in CompactNumberFormat<\/li>\n\n<li>JDK-8202385 : Add the annotation <code>@Serial<\/code> that allows to mark fields\/methods as relative to serialization. As the serialization protocol is based on <em>standards<\/em> fields and methods and not something more robust, the compiler cannot validate the signature of those fields and methods. Now by annotating a field (like serialVersionUID) or a method (like writeObject) with <code>@Serial<\/code> the compiler will be able to verify the signature of those fields and mehtods and avoid potential development issue.<\/li>\n<\/ul>\n<h2>JEP 343: Packaging Tool (Incubator)<\/h2>\n<p><strong>jpackage<\/strong> is a tool that allows to package your application in an OS native format (warning, this is the packaging format that is native not your application, this has nothing to do with GraalVM native image).<\/p>\n<p>My OS is Ubuntu, so <strong>jpackage<\/strong> will package my application in the <strong>.deb<\/strong> format. I will take as example the <a href=\"https:\/\/quarkus.io\/guides\/getting-started\" target=\"_blank\" rel=\"noopener noreferrer\">getting-started <\/a> application of Quarkus.<\/p>\n<p>First, I need to use <strong>jpackage<\/strong> to generate a package. I need to give it the directory of my application (&#8211;input) and it&#8217;s main (here &#8211;main-jar to give jpackage the jar that contains the main).<\/p>\n<pre>$ jpackage --name getting-started --input target --main-jar getting-started-1.0-SNAPSHOT-runner.jar\nWARNING: Using incubator modules: jdk.incubator.jpackage\n<\/pre>\n<p>Then I can use <strong>dpkg<\/strong> to install this package on my OS.<\/p>\n<pre>$ sudo dpkg -i getting-started_1.0-1_amd64.deb \nS\u00e9lection du paquet getting-started pr\u00e9c\u00e9demment d\u00e9s\u00e9lectionn\u00e9.\n(Lecture de la base de donn\u00e9es... 256348 fichiers et r\u00e9pertoires d\u00e9j\u00e0 install\u00e9s.)\nPr\u00e9paration du d\u00e9paquetage de getting-started_1.0-1_amd64.deb ...\nD\u00e9paquetage de getting-started (1.0-1) ...\nParam\u00e9trage de getting-started (1.0-1) ...\n<\/pre>\n<p>The application will be installed inside \/opt\/getting-started, to launch it there is an executable inside the bin directory.<\/p>\n<pre>$ \/opt\/getting-started\/bin\/getting-started \n2019-12-31 17:17:25,933 INFO  [io.quarkus] (main) getting-started 1.0-SNAPSHOT (running on Quarkus 1.0.1.Final) started in 1.130s. Listening on: http:\/\/0.0.0.0:8080\n2019-12-31 17:17:25,937 INFO  [io.quarkus] (main) Profile prod activated. \n2019-12-31 17:17:25,937 INFO  [io.quarkus] (main) Installed features: [agroal, cdi, resteasy]\n<\/pre>\n<p>My application files has been located inside \/opt\/getting-started\/lib\/app\/, other directories contain some files related to <strong>jpackage<\/strong>.<\/p>\n<p>Finally, I can uninstall the package via the <strong>dpkg<\/strong> command.<\/p>\n<pre>$ sudo dpkg -r getting-started\n(Lecture de la base de donn\u00e9es... 256753 fichiers et r\u00e9pertoires d\u00e9j\u00e0 install\u00e9s.)\nSuppression de getting-started (1.0-1) ...\n<\/pre>\n<p>More info in the JEP: <a href=\"https:\/\/openjdk.java.net\/jeps\/343\"><a href=\"https:\/\/openjdk.java.net\/jeps\/343\">https:\/\/openjdk.java.net\/jeps\/343<\/a><\/a><\/p>\n<h2>JEP 352: Non-Volatile Mapped Byte Buffers<\/h2>\n<p>The <code>MappedByteBuffer<\/code> API has been updated to support <em>Non-Volatile Memory<\/em> (NVM).<\/p>\n<p>More info in the JEP: <a href=\"https:\/\/openjdk.java.net\/jeps\/352\"><a href=\"https:\/\/openjdk.java.net\/jeps\/352\">https:\/\/openjdk.java.net\/jeps\/352<\/a><\/a><\/p>\n<h2>JEP 370: Foreign-Memory Access API (Incubator)<\/h2>\n<p>A new incubator module has been created to holds an off-heap memory access API.<\/p>\n<p>This functionality targets framework developers as it is rare to need to access native memory from inside a Java application.<\/p>\n<p>Until now, framework developers mainly used <code>ByteBuffer<\/code> and <code>Unsafe<\/code> to access native memory. As the usage of <code>Unsafe<\/code> is strongly discouraged and <code>ByteBuffer<\/code>\u00a0has a lot of disadvantage, this new API wants to be more easy to use and as performant as <code>Unsafe<\/code> (even more as it has been designed to be easily optimizable by the JIT).<\/p>\n<p>Here is a simple usage of the API (it can cover more complex use cases with the concept of memory layout and stride to allow multi-dimensional layouts).<\/p>\n<pre>VarHandle intHandle = MemoryHandles.varHandle(int.class);\n\ntry (MemorySegment segment = MemorySegment.allocateNative(100)) {\n   MemoryAddress base = segment.baseAddress();\n   for (int i = 0 ; i &amp;lt; 25 ; i++) {\n        intHandle.set(base.offset(i * 4), i);\n   }\n}\n<\/pre>\n<p>More info in the JEP: <a href=\"https:\/\/openjdk.java.net\/jeps\/370\"><a href=\"https:\/\/openjdk.java.net\/jeps\/370\">https:\/\/openjdk.java.net\/jeps\/370<\/a><\/a><\/p>\n<h2>Garbage Collector<\/h2>\n<p>A lot of news regarding GC: new functionalities, performance improvements, deprecation and deletion !<\/p>\n<h3>JEP 345: NUMA-Aware Memory Allocation for G1<\/h3>\n<p>G1 has been updated to be &#8220;NUMA-Aware&#8221;. NUMA &#8211; <em>Non Uniform Memory Access<\/em> -is a characteristic of modern CPU architectures; to make is very simple, the cost of cache \/ memory access can be different from one core to another to a cache line \/ a memory slot.<\/p>\n<p>The G1 algorithm has been modified to take it into account (prefer to make an allocation closest to the CPU). ParallelGC is NUMA-aware since a long time, G1 is therefore just catching up on the subject.<\/p>\n<p>This functionality mainly targets machines with several sockets or a large number of cores, some aggressive benchmarks on the GC side show a performance optimization of around 5% with the <code> + UseNUMA <\/code> option.<\/p>\n<p>More info in the JEP : <a href=\"https:\/\/openjdk.java.net\/jeps\/345\"><a href=\"https:\/\/openjdk.java.net\/jeps\/345\">https:\/\/openjdk.java.net\/jeps\/345<\/a><\/a><\/p>\n<h3>JEP 363: Remove the Concurrent Mark Sweep (CMS) Garbage Collector<\/h3>\n<p>After being deprecated with Java 9, CMS is finally deleted with Java 14, no one in the community wanted to maintain it.<\/p>\n<p>CMS was a very powerful concurrent GC algorithm, targeting medium-sized heap, and highly configurable. It suffered from the lack of compaction phase, and Oracle wishing to invest more and more in G1 and ZGC, no longer wished to maintain another concurrent algorithm.<\/p>\n<p>Until recently, it was one of the most efficient algorithms for heap of medium size, and very often we could not configure G1 to have such high performance. Hopefully with the new optimizations made in G1 in the latest versions of Java it can now manage to have performance close to CMS &#8230; or else there is always ZGC and Shenandoah &#8230;.<\/p>\n<p>More info in the JEP : <a href=\"https:\/\/openjdk.java.net\/jeps\/363\"><a href=\"https:\/\/openjdk.java.net\/jeps\/363\">https:\/\/openjdk.java.net\/jeps\/363<\/a><\/a><\/p>\n<h3>JEP 365: ZGC on Windows et JEP 364: ZGC on macOS<\/h3>\n<p>The ZGC Garbage Collector has been ported to Windows (version 1803 of Windows 10 minimum) and macOS.<\/p>\n<p>More info in the JEP: <a href=\"https:\/\/openjdk.java.net\/jeps\/364\"><a href=\"https:\/\/openjdk.java.net\/jeps\/364\">https:\/\/openjdk.java.net\/jeps\/364<\/a><\/a> et <a href=\"https:\/\/openjdk.java.net\/jeps\/365\"><a href=\"https:\/\/openjdk.java.net\/jeps\/365\">https:\/\/openjdk.java.net\/jeps\/365<\/a><\/a><\/p>\n<h3 id=\"summary-val\">Parallel GC<\/h3>\n<p><strong>JDK-8204951 &#8211; Investigate to use WorkGang for Parallel GC<\/strong> : change in ParallelGC thread management, it now uses the same WorkGang as the other GCs. Less maintenance cost, and above all, optimized GC performance between 0% and 40% depending on the benchmark (average of 10%).<\/p>\n<p>More info in the JBS : <a href=\"https:\/\/bugs.openjdk.java.net\/browse\/JDK-8204951\"><a href=\"https:\/\/bugs.openjdk.java.net\/browse\/JDK-8204951\">https:\/\/bugs.openjdk.java.net\/browse\/JDK-8204951<\/a><\/a><\/p>\n<p><strong>JDK-8220465 &#8211; Use shadow regions for faster ParallelGC full GCs<\/strong> : optimization of the implementation of full collections for ParallelGC. Tests have shown performance x2 to x3 in case of full GC!<\/p>\n<p>More info in the JBS : <a href=\"https:\/\/bugs.openjdk.java.net\/browse\/JDK-8220465\"><a href=\"https:\/\/bugs.openjdk.java.net\/browse\/JDK-8220465\">https:\/\/bugs.openjdk.java.net\/browse\/JDK-8220465<\/a><\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>Now that Java 14 is features complete (Rampdown Phase One at the day of writing), it\u2019s time to walk throught all it\u2019s functionalities that brings to us, developers, this new version. This article is part of a series on what\u2019s new on the last versions of Java, for those who wants to read the others, here are the links : Java 13, Java 12, Java 11,\u00a0Java 10, and Java 9. As opposite to the previous Java versions, the version 14&#8230;<p class=\"read-more\"><a class=\"btn btn-default\" href=\"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-14-quoi-de-neuf\/\"> Read More<span class=\"screen-reader-text\">  Read More<\/span><\/a><\/p><\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":4,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"","footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[9],"tags":[11,176,163],"class_list":["post-979","post","type-post","status-publish","format-standard","hentry","category-informatique","tag-java","tag-java14","tag-whatsnew"],"aioseo_notices":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":1112,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-15-quoi-de-neuf\/","url_meta":{"origin":979,"position":0},"title":"Java 15 : what&#8217;s new ?","author":"admin","date":"Thursday July  2nd, 2020","format":false,"excerpt":"Now that Java 15 is features complete (Rampdown Phase One at the day of writing), it\u2019s time to walk throught all it\u2019s functionalities that brings to us, developers, this new version. This article is part of a series on what\u2019s new on the last versions of Java, for those who\u2026","rel":"","context":"In &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":722,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-10-quoi-de-neuf\/","url_meta":{"origin":979,"position":1},"title":"Java 10 : what&#8217;s new ?","author":"admin","date":"Monday March 26th, 2018","format":false,"excerpt":"Now that java 10 is out, it's time to look at all the new functionalities of this version. Like my previous article on Java 9, I will focus on the changes that will impact developers that uses Java leaving aside the changes that are internal\/very small\/on rarely used API. The\u2026","rel":"","context":"In &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1375,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-18-quoi-de-neuf\/","url_meta":{"origin":979,"position":2},"title":"Java 18 : what&#8217;s new ?","author":"admin","date":"Tuesday January  4th, 2022","format":false,"excerpt":"Now that Java 18 is features complete (Rampdown Phase One at the day of writing), it\u2019s time to walk throught all the functionalities that brings to us, developers, this new version. This article is part of a series on what\u2019s new on the last versions of Java, for those who\u2026","rel":"","context":"In &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":947,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-13-quoi-de-neuf\/","url_meta":{"origin":979,"position":3},"title":"Java 13 : what&#8217;s new ?","author":"admin","date":"Tuesday August 13th, 2019","format":false,"excerpt":"Now that Java 13 is features complete (Release Candidate at the day of writing), it\u2019s time to walk throught all it\u2019s functionalities that brings to us, developers, this new version. This article is part of a series on what\u2019s new on the last versions of Java, for those who wants\u2026","rel":"","context":"In &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1684,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-21-quoi-de-neuf\/","url_meta":{"origin":979,"position":4},"title":"Java 21: what&#8217;s new ?","author":"admin","date":"Tuesday August  8th, 2023","format":false,"excerpt":"Now that Java 21 is features complete (Rampdown Phase Two at the day of writing), it\u2019s time to walk through all the functionalities that bring to us, developers, this new version. This article is part of a series on what\u2019s new on the last versions of Java, for those who\u2026","rel":"","context":"In &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/category\/informatique\/"},"img":{"alt_text":"Java Collection API hierarchy","src":"https:\/\/i0.wp.com\/cr.openjdk.org\/~smarks\/collections\/SequencedCollectionDiagram20220216.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/cr.openjdk.org\/~smarks\/collections\/SequencedCollectionDiagram20220216.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/cr.openjdk.org\/~smarks\/collections\/SequencedCollectionDiagram20220216.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/cr.openjdk.org\/~smarks\/collections\/SequencedCollectionDiagram20220216.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/cr.openjdk.org\/~smarks\/collections\/SequencedCollectionDiagram20220216.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/cr.openjdk.org\/~smarks\/collections\/SequencedCollectionDiagram20220216.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":865,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-12-quoi-de-neuf\/","url_meta":{"origin":979,"position":5},"title":"Java 12 : what&#8217;s new","author":"admin","date":"Wednesday January 23rd, 2019","format":false,"excerpt":"Now that Java 12 is features complete (Rampdown Phase 2 at the day of writing), it's time to walk throught all it's fonctionalities that brings to us, developers, this new version. This article is part of a serie on what's new on the last versions of Java, for those who\u2026","rel":"","context":"In &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/wp-json\/wp\/v2\/posts\/979","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/wp-json\/wp\/v2\/comments?post=979"}],"version-history":[{"count":0,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/wp-json\/wp\/v2\/posts\/979\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/wp-json\/wp\/v2\/media?parent=979"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/wp-json\/wp\/v2\/categories?post=979"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/wp-json\/wp\/v2\/tags?post=979"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}