一、前言
随着Java技术的不断发展和进步,Java开发人员对于新特性的需求也越来越高。从JDK 9到JDK 21,Java发布了一系列重要的更新和改进,以满足开发人员的需求并提高应用程序的性能和安全性。本文将介绍JDK9到JDK 921的核心新特性,帮助您更好地了解这些更新对于Java开发的影响。
二、新特性&示例
1. JDK 9
1. 1 模块系统(Module System)
JDK 9引入了模块系统,这是Java平台的一个重大改变。模块系统允许将JDK划分为多个模块,每个模块都有自己的API和明确的依赖关系。
通过使用module-info.java文件,开发者可以定义模块的导出包、依赖的其他模块等信息。
模块系统提高了代码的可维护性、封装性、可重用性和可测试性。
代码示例:
假设有两个模块:java9Test和java9。
java9Test模块的module-info.java:
module java9Test {
exports com.strrysky.bean;
}
java9模块的module-info.java`:
module java9 {
requires java9Test;
}
在java9模块中,可以导入并使用java9Test模块导出的包中的类。
1.2 jShell(Java REPL)
jShell是一个交互式Java REPL(Read-Eval-Print Loop)工具,允许开发者从命令行或终端直接运行Java代码片段。
它使得Java代码测试、原型设计和学习变得更加容易和快速。
使用方式:
在JDK 9的bin目录下输入jshell即可启动jShell。在jShell中,可以直接声明变量、计算表达式、执行语句等。
1.3 集合工厂方法的不可变集合
JDK 9为集合API添加了一些新的工厂方法,用于创建不可变集合。这些方法包括List.of(), Set.of(), Map.of()等。
代码示例:
List<String> list = List.of("a", "b", "c");
Set<String> set = Set.of("a", "b", "c");
Map<String, Integer> map = Map.of("one", 1, "two", 2, "three", 3);
1.4 改进的Stream API功能
JDK 9对Stream API进行了一些改进,增加了新的操作和方法。
代码示例:
List<String> list = Arrays.asList("a", "b", "c", "a", "b", "d");
long count = list.stream()
.filter(s -> s.equals("a"))
.count(); // 计算列表中"a"的个数
1.5 多版本兼容JAR(Multi-Release JARs)
JDK 9支持在单个JAR文件中包含多个版本的类文件,以支持不同版本的Java运行时环境。
1.6. 更多的新特性和改进
除了上述特性外,JDK 9还引入了其他多项新特性和改进,如接口私有方法、语法改进(如try-with-resources的改进)、HTTP/2客户端、改进的弃用注解@Deprecated等。这些特性和改进旨在提高Java的开发效率和代码质量
2. JDK10
2.1 局部变量类型推断
使用var关键字进行局部变量类型推断。
代码示例:
var list = new ArrayList<String>(); // 编译器推断 list 的类型为 ArrayList<String>
3. JDK 11
3.1 String 增强
增加了一系列的字符串处理方法。
代码示例:
String str = "Hello";
String result = str.repeat(3); // "HelloHelloHello"
3.2 HTTP Client
新的标准化HTTP客户端。
代码示例:
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("http://example.com"))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()
4. JDK 12
4.1 Shenandoah低暂停时间垃圾回收器
这是一个垃圾回收器优化,不涉及代码层面的新特性。
-XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC
5. JDK 13
5.1 文本块(预览语言功能)
多行字符串字面量
代码示例:
String text = """
Hello,
World!
""";
6. JDK14
6.1 switch表达式(标准)
对 switch 进行扩展,使其既可以作为语句也可以作为表达式使用,并使这两种形式都可以使用传统的 case … : labels(有切换)或新的 case …-> 标签(无切换),另外还有一个新语句用于从 switch 表达式中产生一个值。
代码示例:
int day = 3;
String dayType = switch (day) {
case 1, 2, 3, 4, 5 -> "Weekday";
case 6, 7 -> "Weekend";
default -> throw new IllegalArgumentException("Invalid day: " + day);
};
System.out.println(dayType); // 输出:Weekday
6. JDK15
6.1 文本块(Text Blocks)
文本块是一个多行字符串,它可以避免使用大多数转义符号,自动以可预测的方式格式化字符串,并允许开发人员在需要时控制格式。文本块在JDK 13中首次作为预览功能出现,并在JDK 15中被确定下来。
代码示例:
public static void main(String[] args) {
String query = """
SELECT * from USER
WHERE `id` = 1
ORDER BY `id`, `name`;
""";
System.out.println(query);
}
7. JDK16
7.1 Record记录类
作为不可变数据的透明载体。
代码示例:
public record Point(int x, int y) { }
8. JDK17
8.1 Switch表达式增强
JDK 17对Switch表达式进行了进一步增强,包括类型模式匹配和守卫模式。类型模式允许在switch表达式中使用instanceof,而守卫模式则可以使用布尔表达式。
代码示例:
Object obj = "Hello";
String result = switch (obj) {
case String s && s.length() > 5 -> "String longer than 5 chars";
case String s -> "String";
case Integer i -> "Integer";
default -> "Unknown";
};
System.out.println(result); // 输出 "String longer than 5 chars"
8.2 文本块(Text Blocks)
文本块允许开发者使用多行字符串字面量,而无需担心转义字符或字符串拼接。
代码示例:
String json = """
{
"name": "John",
"age": 30,
"message": "Hello, World!"
}
""";
System.out.println(json);
8.3 密封类(Sealed Classes)
密封类限制了一个类可以被哪些其他类继承。这有助于更好地控制类的继承层次结构。
代码示例:
public sealed interface Shape permits Circle, Rectangle {
// ...
}
public final class Circle implements Shape {
// ...
}
public final class Rectangle implements Shape {
// ...
}
9. JDK18
9.1 模式匹配的增强(JEP 420: Pattern Matching for switch)
JDK 18 对模式匹配进行了进一步增强,特别是在与 switch 表达式/语句结合的部分。
引入了更丰富的模式类型,如类型模式、解构模式等,使得在 switch 中处理复杂类型更加直接和清晰。
提供了编译时更强的类型检查,减少了运行时错误。
简化了模式匹配在 switch 中的语法,使代码更加简洁易读。
代码示例:
由于具体的语法变化可能会根据JDK的最终实现有所不同,这里提供一个概念性的示例:
record Point(int x, int y) {}
public class PatternMatchingDemo {
public static void main(String[] args) {
Point p = new Point(1, 2);
switch (p) {
case Point(int x, int y) -> System.out.println("Point: (" + x + ", " + y + ")");
// 其他可能的模式匹配情况...
default -> System.out.println("Unknown type");
}
}
}
9.2 记录类(Record Class)的改进
记录类在 JDK 16 中引入,旨在提供一种简洁、安全且易于理解的数据载体。
在 JDK 18 中,记录类可能会有以下改进:
更灵活的构造器:允许开发者定义更复杂的构造器逻辑,同时保持记录的简洁性。
序列化支持:改进记录类的序列化机制,使其更容易与现有的数据处理库和框架集成。
更好的模式匹配集成:让记录类与模式匹配更好地集成,简化数据结构的解构和处理。
代码示例(这里主要展示记录类的基本用法,因为具体的改进细节在 JDK 18 正式发布时可能会有所不同):
public record Person(String name, int age) {
// 默认构造器、getter、equals、hashCode 和 toString 等方法由编译器自动生成
// 可以在这里定义额外的方法或更复杂的构造器(如果 JDK 18 允许的话)
}
9.3 默认UTF-8字符编码(JEP 400)
JDK 18 将 UTF-8 设置为默认字符编码,使得在不加任何指定的情况下,所有需要用到编码的 JDK API 都默认使用 UTF-8 编码。
这有助于避免因为不同系统、不同地区、不同环境之间产生的编码问题。
10. JDK19~21
没有什么内容,全都是预览功能;比如:Record Pattern;虚拟线程;switch模式匹配(直到21才正式)。不过JDK21,最期待的应该是虚拟线程
以上就是JDK的一些新特性介绍,希望这些信息能够帮助更好地理解和使用Java不同版本提供的新特性,为你带来更多的便利和效益。