Java 11 的新特性
JDK 11(Java Development Kit 11)作为Java平台的一个重要版本,带来了许多令人振奋的新特性和改进。Java 11 是 Java 8 之后的第一个 LTS 版本,于 2018 年 9 月 25 日正式发布,但是也自从 Java 11 开始, Oracle JDK 不再可以免费的用于商业用途,当然如果你是个人使用,或者是使用 Open JDK ,那么还是可以免费使用的。
参考链接:https://openjdk.org/projects/jdk/11/
以下是JDK 11的主要新特性归纳:
1. 字符串处理增强
JDK 11增加了一系列的字符串处理方法,使得字符串操作更加便捷。
isBlank()
isBlank()方法用于判断字符串是否为空或仅包含空白字符(包括空格、制表符、换行符等)。这个方法比传统的 trim().isEmpty()
调用更加简洁和直观。
例如:
String str = " ";
boolean isEmptyOrBlank = str.isBlank(); // true
strip(), stripLeading(), stripTrailing()
这些方法用于去除字符串前后的空白字符。与 trim()
方法不同的是,strip()
方法可以去除包括Unicode空格在内的所有空白字符,而 trim()
方法只能去除ASCII空格。stripLeading()
和 stripTrailing()
分别用于去除字符串首部和尾部的空白字符。
例如:
String str = " Java ";
String stripped = str.strip(); // "Java"
String strippedLeading = str.stripLeading(); // "Java "
String strippedTrailing = str.stripTrailing(); // " Java"
repeat(n)
repeat(n) 方法用于将字符串重复n次并返回结果。这在需要重复拼接字符串时非常有用。
例如:
String str = "Java";
String repeated = str.repeat(3); // "JavaJavaJava"
lines()
lines()方法将字符串按照行终止符(如换行符\n
或回车符\r
)分割成多个字符串,并返回一个Stream<String>
流。这使得对多行字符串的处理变得更加容易。
例如:
String str = "Hello\nWorld\nJava 11";
long count = str.lines().count(); // 3
str.lines().forEach(System.out::println);
// Hello
// World
// Java 11
2. File API改动
读写文件变得更加方便。
// 创建临时文件
Path path = Files.writeString(Files.createTempFile("temp", ".txt"), "abc123");
// 读取文件
String s = Files.readString(path);
System.out.println(s); // abc123
3. HTTP Client API的标准化
正式支持:Http Client API在JDK 11中得到了标准化的支持,替代了老旧的HttpURLConnection。
功能:支持HTTP/1.1和HTTP/2协议,也支持WebSockets。
优势:新的HttpClient提供了更加简洁、灵活且易于使用的接口,能够与现代的Web服务相互操作。
例子:
// 创建 HttpClient 实例
HttpClient client = HttpClient.newHttpClient();
// 创建 HttpRequest 实例,指定请求方法和 URL
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://httpbin.org/get")) // 这里我们使用 httpbin.org 来模拟请求
.header("User-Agent", "Java 11 HttpClient Bot") // 添加请求头
.GET() // 这是一个 GET 请求
.build();
// 发送请求并获取响应
try {
// 同步请求
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
// 异步请求
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::body)
.thenAccept(System.out::println)
.join();
// 处理响应
if (response.statusCode() == 200) {
System.out.println("请求成功!");
System.out.println("响应体: " + response.body());
} else {
System.out.println("请求失败,状态码: " + response.statusCode());
}
} catch (IOException | InterruptedException e) {
System.err.println("请求发生错误: " + e.getMessage());
}
4. Lambda 局部变量类型推断
Java 10 引入了 var
语法,用于自动推断变量类型,使代码更简洁。而在 Java 11 中,这个方便的语法糖被扩展到了 Lambda 表达式中,进一步简化了代码编写。
例子:
// 使用 var 声明 List 集合
var list = Arrays.asList("apple", "banana", "cherry");
// 使用 var 在 Lambda 表达式中声明局部变量
// 这里我们过滤出列表中所有长度大于 5 的字符串
var filteredList = list.stream()
.filter(s -> {
// 在 Lambda 表达式内部使用 var 声明局部变量
var length = s.length();
return length > 5;
})
.toList();
5. 编译和运行简化
从学习Java之初,我们通常遵循先使用javac
命令编译Java文件,随后通过java
命令来运行编译后的字节码。但现在,借助Java11的新特性,我们只需一个java
命令就能直接运行Java文件,简化了过程。
例子:
public class Main {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
$ java Main.java // 不用 javac Main.java 编译成Main.class 后再 java Main了
Hello World
7. Java飞行记录器(Flight Recorder)
功能:Java飞行记录器是一种低开销的事件信息收集框架,类似于飞机上的黑盒子,用于对应用程序和JVM进行故障检查、分析。
开源:在JDK 11中,Java飞行记录器从Oracle JDK开源到了OpenJDK,成为JDK 11的一部分。
8. 其他改进
Unicode 10.0支持:JDK 11支持Unicode 10.0版本,包括16018个新的字符、18个新的Block和10个新的Script。
支持TLS 1.3协议:DK 11实现了TLS协议1.3版本,替换了之前的TLS版本(包括TLS 1.2),并改进了其他TLS功能,在安全性和性能方面都做了提升。
加密算法更新:JDK 11增加了ChaCha20和Poly1305加密算法(JEP 329),提供了更安全的加密选项。
9. 预测性GC(Predictive GC)
实验性功能:基于过去的GC数据和分析算法,预测出垃圾收集的最佳时间,以提高系统的性能和吞吐量。
10. 新的垃圾回收器
Epsilon GC:一个实验性的低开销垃圾回收器,仅分配有限的内存资源,最大限度地降低内存占用和内存吞吐延迟时间。它主要用于性能测试或内存压力测试。
ZGC:一个可扩展的低延迟垃圾收集器(JEP 333),旨在实现极短的GC停顿时间,同时支持大内存堆的处理。虽然目前还是实验特性,但为特定生产环境的苛刻需求提供了一个可能的选择。
评论区