Since version 9, Java has new features every 6 months and it’s very hard to keep track of these new changes. Most of the information on the internet describes changes between the last 2 Java versions. However, if you’re in a similar situation as me, you’re not using the last Java version but a version several releases older.
Then it’s useful to know which new features were added since the version you use now, or between the versions that you use now and the one you want to start using next. Therefore I’ve compiled a table with all new features added since Java 8 for each new Java version.
Note that I didn’t include all the new features and API additions, only those that are useful for most developers, to keep the list brief.
Below you can find tables for:
- New Java language features – additions to the Java language or APIs
- New tools and features in OpenJDK – additions outside of the language, such as command line tools or JVM improvements
- Deprecated/removed features and APIs
UPDATE: Dávid Csákvári also wrote a similar article for new features between Java 8 and Java 15, a more detailed one, with a lot of useful examples.
New Java language features since Java 8
Feature | Since | Preview since |
Sealed classes (inheritance only for allowed classes):public abstract sealed class Shape permits Circle, Rectangle, Square {...} | 15 | |
Record type – data classes with implicit getters, constructor, equals , hashCode and toString methods:record Point(int x, int y) { } | 16 | 14 |
Pattern Matching for instanceof : if (x instanceOf String s) { String a = s; } | 16 | 14 |
Text blocks:String query = """ SELECT "EMP_ID", "LAST_NAME" FROM "EMPLOYEE_TB"; """ | 15 | 13 |
Switch expressions:boolean isWeekend = switch (day) { case SATURDAY, SUNDAY -> true; default -> false ;}; | 14 | 12 |
New String methods (indent , transform ) | 12 | |
CompactNumberFormat class | 12 | |
New String methods (repeat , isBlank , strip , lines ) | 11 | |
var type allowed in Lambda Parameters:(@NonNull var x) -> process(x) | 11 | |
New HTTP client API | 11 | 9 |
TLS v1.3 – support for a new SSL/TLS protocol version | 11 | |
var type allowed for local variables:var length = str.length(); | 10 | |
Flow API (reactive streams) | 9 | |
Java Platform Module System (modules) | 9 | |
Collection factory methods:List.of(a, b, c); Set.of(d, e, f, g); Map.of(k1, v1, k2, v2) ; | 9 | |
Stream API improvements (takeWhile , dropWhile , ofNullable , iterate with condition) | 9 | |
Multi-Resolution Image API | 9 | |
Stack-Walking API | 9 | |
this.getClass().getPackageName() | 9 | |
Process API updates (detailed info about processes, e.g. ID, onExit, destroy) | 9 | |
new methods in CompletableFuture API (delay , timeout ) | 9 | |
Interface private methods | 9 | |
since and forRemoval in @Deprecated | 9 | |
Interface Default and Static Methods | 8 | |
Method References | 8 | |
Optional class | 8 | |
Lambda expressions | 8 | |
Functional interfaces | 8 | |
Stream API | 8 | |
Effectively Final Variables | 8 | |
Repeating Annotations | 8 | |
New Date Time API | 8 |
New JDK tools and features since OpenJDK 8
Tool / feature | Since | Experimental since |
Experimental Java-Based JIT Compiler (Graal VM) | 10 | |
Packaging Tool | 14 | |
Epsilon (no-op) GC | 11 | |
Shenandoah GC | 15 | 12 |
Z GC (JEP 377) | 15 | 11 |
Helpful NullPointerExceptions | 14 | |
Launching Java files as scripts | 11 | |
Flight recorded (data collection framework for troubleshooting) | 11 | |
Docker Container Support: -XX:-UseContainerSupport | 10, 8u191 | |
Flexible heap size selection:-XX:MaxRAMPercentage | 10, 8u191 | |
Application Class-Data Sharing (CDS) | 10 | |
jlink – custom JRE image, subset of JRE | 9 | |
JShell (Java REPL) – run Java commands interactively | 9 | |
Multi-Release JAR Files | 9 | |
Compact Strings | 9 |
Deprecated/removed features and APIs:
Feature / API | Deprecated since | Removed since |
Constructors of primitive wrapper classes (e.g. new Integer(1) ) | 16 | |
RMI Activation | 15 | |
ParallelScavenge + SerialOld GC Combination | 14 | |
Nashorn JavaScript Engine | 11 | 15 |
Solaris and SPARC Ports | 14 | 15 |
CMS GC | 9 | 14 |
Pack200 Tools and API | 11 | 14 |
Java FX (moved to OpenJFX) | 11 | |
Java EE and CORBA modules | 9 | 11 |
javah Native-Header Generator | 10 | |
jhat Heap Visualizer | 9 | |
Launch-Time JRE Version Selection | 9 | |
Rarely-Used GC Combinations | 8 | 9 |
Applet API | 9 |
For more details, the javaalmanac.io/ catalog is very useful to browse the changes in Java thoughout all its history. It can give you complete diff of APIs between selected Java versions, e.g. between Java 8 and Java 11. Very useful If you’re thinking about migrating to a specific Java version.