New features between Java 8 and Java 17

Java Duke surfing

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 since Java 8

Feature
Since
Preview since
Context-Specific Deserialization Filters – allow applications to configure deserialization filters, either specify a pattern via a system property, or a filter factory via a system property or via ObjectInputFilter.Config
17
Pattern Matching for switch
switch (o) {
case null -> System.out.println("null");
case String s -> System.out.println("String");
case Point p -> System.out.println(p.toString());
case int[] ia -> System.out.println("Array length" + ia.length);
default -> System.out.println("Something else");
}
17
Vector API – express computations that compile to optimal hardware instructions
16
Sealed classes (inheritance only for allowed classes):
public abstract sealed class Shape permits Circle, Rectangle, Square {...}
17
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
New String methods (formatted, stripIndent, translateEscapes)
15
Switch expressions:
boolean isWeekend = switch (day) {
case SATURDAY, SUNDAY -> true;
default -> false;
};
14
12
New String methods (indent, transform)
12
12
New String methods (repeat, isBlank, strip, lines)
11
var type allowed in Lambda Parameters:
(@NonNull var x) -> process(x)
11
11
TLS v1.3 – support for a new SSL/TLS protocol version
11
var type allowed for local variables:
var length = str.length();
10
9
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
9
9
this.getClass().getPackageName()
9
Process API updates (detailed info about processes, e.g. ID, onExit, destroy)
9
9
9
9
8
8
8
8
8
8
8
8
8

New JDK tools and features since OpenJDK 8

Tool / feature
Since
Experimental since
Foreign Function & Memory API (an alternative to JNI)
17
14
11
10
15
12
15
11
14
11
Flight recorder (data collection framework for troubleshooting)
11
Docker Container Support:
-XX:-UseContainerSupport
10,
8u191
Flexible heap size selection:
-XX:MaxRAMPercentage
10,
8u191
10
jlink – custom JRE image, subset of JRE
9
JShell (Java REPL) – run Java commands interactively
9
9
9

Deprecated/removed features and APIs:

Feature / API
Deprecated since
Removed since
17
17
16
15
17
14
Strongly Encapsulate JDK Internals (except sun.misc.Unsafe and some more)
– internal JDK classes won’t be available anymore
9
17
11
15
14
15
CMS GC
9
14
11
14
Java FX (moved to OpenJFX)
11
9
11
10
9
9
8
9
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.

Dávid Csákvári also wrote a similar article as mine for new features between Java 8 and Java 17, which is more detailed and with a lot of useful examples.

6 thoughts on “New features between Java 8 and Java 17

    1. Thank you for the hint, Mateo. I’ve added info about String.formatted and the other 2 methods added in Java 15. Although just brief into, I want this article to highlight the major changes so that people know what might be interesting to look at and start using when they upgrade.

  1. Alright, cool! Yeah it’s just I think that formatted is a rather significant change; it’s changed how I inject variables into strings (it’s more syntactically nice this way imo)

Leave a Reply

Your email address will not be published. Required fields are marked *