Busy Developers’ Guide to Java 9, 10, 11, 12, 13, and Above

This article is supposed to be an up-to-date source of curated information about changes that arrived in Java recently, and these that are about to – everything condensed into just a few minutes of reading.

After adopting a new cadence-based release cycle, new Java versions started appearing like crazy, and if you haven’t caught up yet – this is an excellent place to start.

Last update: 18.09.2020

Main Source of Confusion: New Release Cycle

In the past, Java releases were driven by prominent features like Lambda Expressions or Generics. Unfortunately, this approach ended up being quite harmful since numerous improvements could not be released until the main feature was ready.

Now, a Java version appears every six months and all the ready features, get released, which speeds up the evolution of Java – which is a great thing on its own but can generate confusion for people that got used to the fact that one would expect a new Java version to be released after years not months of waiting. We’re also more likely to see more Preview, Incubating, and Experimental features.

But not all Java versions are made equal – only one release every three years can be considered LTS (Long Term Support) with the last LTS being Java 11.

Java 9

Java 9 was the last feature-oriented Java release ever and featured an impressive number of 81 JEPs.

The most important addition was JPMS (also known as Project Jigsaw), but besides that we got:

Release date: 21 September 2017

All JEPs can be found here.

Java 10

Java 10 was the first one to be released under the new release cycle. Hence it featured only 12 JEPs and various small API additions accumulated within six months after Java 9 was released.

The most notable changes involved an introduction of local-variable-type-inference(var), Garbage Collector interface, G1 improvements (parallel full GC), and application class-data sharing.

Among other stuff, we received new handy Collectors to be used with unmodifiable collections:

Collectors.toUnmodifiableList()

Collectors.toUnmodifiableSet()

Collectors.toUnmodifiableMap()

Release date: 20 March 2018

All JEPs can be found here.

Java 11 (LTS)

Java 11 was the first Long-Term-Support release and featured 17 JEPs.

The most notable changes involved the addition of HTTPClient, Flight Recorder, experimental low-pause garbage collector(ZGC), and an experimental no-op garbage collector(Epsilon). Additionally, Java EE and CORBA modules got removed, and Nashorn deprecated.

We also got a tiny addition to Optional API: isEmpty(), which is the opposite of isPresent().

And a few interesting methods in String API:

Release date: 25 September 2018

All JEPs can be found here.

Java 12

Another relatively small release featuring only 8 JEPs.

Language-wise Switch Expressions were introduced as a preview feature, we got two G1 improvements(1, 2), and a new experimental low-pause garbage collector – Shenandoah.

Release date: 19 March 2019

All JEPs can be found here.

Java 13

The smallest release to date bringing only 5 JEPs.

Switch Expressions were refined, Text Blocks got introduced as a preview feature, and Socket API reimplemented. Additionally, we got Linux/AArch64 support for ZGC.

Release date: 17 September 2019

All JEPs can be found here.

Java 14

Java 14 had quite a few interesting additions:

Release date: 17 March 2020

All JEPs can be found here.

Java 15

Java 15 is already out and brought a few interesting additions:

As well as second previews of:

And the second incubator release of Foreign Memory Access API!

Release date: 17 September 2020

All JEPs can be found here.

Java 16

We don’t know much yet, but so far we can expect to see:

Other than this, OpenJDK development is going to take a huge leap of faith… and migrate to Git and Github. Which will make the whole project much more accessible.

Other than this, we’ll see newer C++ constructs in JVM’s code.

All JEPs can be found here.

Release date: ~March 2021



