JDK 11(Java SE 11)是继 JDK 8 之后的第二个长期支持(LTS)版本,在 JDK 9/10 的基础上进一步完善了功能,引入了多项实用特性,提升了开发效率和性能。以下是 JDK 11 的主要新特性及重要特性的代码示例:
一、主要新特性列表
- 局部变量类型推断增强(var在 Lambda 参数中的使用):允许在 Lambda 表达式中使用
var声明参数,支持注解 - 字符串增强:新增
isBlank()、lines()、strip()、stripLeading()、stripTrailing()、repeat(n)等方法 - 集合增强:
Collection接口新增toArray(IntFunction<T[]>)重载方法,简化数组转换 - HTTP 客户端标准化(java.net.http):将 JDK 9 引入的 HttpClient 从孵化阶段正式纳入标准库,支持同步 / 异步 HTTP 请求
- Optional 增强:新增
isEmpty()方法,判断值是否为空 - File API 增强:
Files类新增readString()和writeString()方法,简化文件读写 - 单文件源代码程序运行:无需先编译,直接通过
java命令运行.java文件 - ZGC 垃圾收集器:引入低延迟垃圾收集器(实验性,JDK 15 后转正),支持 TB 级内存,暂停时间不超过 10ms
- Epsilon 垃圾收集器:“无操作” 垃圾收集器,仅分配内存不回收,用于性能测试
- 飞行记录器(Flight Recorder):从商业功能变为免费功能,用于诊断和分析 Java 应用运行时信息
- 移除废弃功能:移除
com.sun.awt.AWTUtilities、sun.misc.Unsafe.defineClass等废弃 API,以及 Java EE 和 CORBA 模块
二、重要特性及代码示例
1. 局部变量类型推断增强(var在 Lambda 参数中的使用)
JDK 10 引入var用于局部变量类型推断(如var list = new ArrayList<String>()),JDK 11 进一步允许在 Lambda 表达式中使用var声明参数,同时支持对参数添加注解,解决了 Lambda 参数无法直接注解的问题。
示例:Lambda 参数使用var及注解
import java.util.Arrays;
import java.util.List;
public class VarLambdaExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
// JDK 11前:Lambda参数需显式声明类型(如需注解,需加类型)
names.forEach((String s) -> System.out.println(s));
// JDK 11:使用var声明Lambda参数(更灵活)
names.forEach((var s) -> System.out.println(s));
// 支持参数注解(结合var)
names.forEach((@Deprecated var s) -> System.out.println(s));
}
}
2. 字符串增强方法
JDK 11 为String类新增了多个实用方法,简化字符串处理(如空白判断、多行处理、修剪、重复等)。
示例:字符串新方法
public class StringEnhanceExample {
public static void main(String[] args) {
// 1. isBlank():判断字符串是否为空白(仅空格、制表符等,无实际字符)
String blankStr = " \t\n";
System.out.println(blankStr.isBlank()); // 输出:true(空白)
System.out.println(" a ".isBlank()); // 输出:false(含非空白字符)
// 2. lines():将字符串按行分割为Stream
String multiLine = "Hello\nWorld\nJava 11";
multiLine.lines().forEach(line -> System.out.println("Line: " + line));
// 输出:
// Line: Hello
// Line: World
// Line: Java 11
// 3. strip():去除前后空白(类似trim(),但支持Unicode空白字符)
String strWithSpaces = " \u2002test\u2002 "; // \u2002是Unicode空格
System.out.println("[" + strWithSpaces.trim() + "]"); // 输出:[ test ](trim()无法处理Unicode空格)
System.out.println("[" + strWithSpaces.strip() + "]"); // 输出:[test](strip()支持Unicode)
// 4. repeat(n):重复字符串n次
String repeated = "ab".repeat(3);
System.out.println(repeated); // 输出:ababab
}
}
3. HTTP 客户端标准化(java.net.http)
JDK 11 将HttpClient从孵化模块(jdk.incubator.http)正式纳入标准库(java.net.http),支持 HTTP/1.1 和 HTTP/2,提供同步和异步请求方式,API 更简洁易用。
示例:使用 HttpClient 发送 HTTP 请求
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
public class HttpClientExample {
public static void main(String[] args) throws Exception {
// 创建HttpClient
HttpClient client = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_2) // 使用HTTP/2
.connectTimeout(Duration.ofSeconds(10))
.build();
// 1. 发送同步GET请求
HttpRequest getRequest = HttpRequest.newBuilder()
.uri(URI.create("https://httpbin.org/get"))
.GET()
.build();
HttpResponse<String> getResponse = client.send(getRequest, HttpResponse.BodyHandlers.ofString());
System.out.println("同步GET响应状态:" + getResponse.statusCode());
System.out.println("同步GET响应体:" + getResponse.body());
// 2. 发送异步POST请求
HttpRequest postRequest = HttpRequest.newBuilder()
.uri(URI.create("https://httpbin.org/post"))
.header("Content-Type", "text/plain")
.POST(HttpRequest.BodyPublishers.ofString("Hello from Java 11 HttpClient"))
.build();
client.sendAsync(postRequest, HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::body)
.thenAccept(body -> System.out.println("异步POST响应体:" + body))
.join(); // 等待异步操作完成
}
}
4. File API 增强(readString和writeString)
JDK 11 为java.nio.file.Files类新增了readString(Path)和writeString(Path, CharSequence)方法,无需手动处理输入流 / 输出流,直接读写文本文件。
示例:简化文件读写
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class FileEnhanceExample {
public static void main(String[] args) throws Exception {
Path path = Paths.get("test.txt");
// 1. 写入字符串到文件
String content = "Hello, JDK 11 Files API!";
Files.writeString(path, content); // 自动处理编码(默认UTF-8)
System.out.println("文件写入完成");
// 2. 从文件读取字符串
String readContent = Files.readString(path);
System.out.println("文件内容:" + readContent); // 输出:Hello, JDK 11 Files API!
}
}
5. Optional 增强(isEmpty()方法)
Optional类新增isEmpty()方法,用于判断值是否为空(与isPresent()相反),语义更清晰。
示例:Optional 的 isEmpty ()
import java.util.Optional;
public class OptionalEnhanceExample {
public static void main(String[] args) {
Optional<String> optional = Optional.ofNullable(null);
// JDK 11前:判断为空需用!isPresent()
if (!optional.isPresent()) {
System.out.println("值为空(旧方式)");
}
// JDK 11:使用isEmpty()直接判断
if (optional.isEmpty()) {
System.out.println("值为空(新方式)"); // 输出此句
}
}
}
6. 单文件源代码程序运行
JDK 11 允许直接通过java命令运行单个.java文件,无需先执行javac编译,简化了小型程序的运行流程。
示例:运行单文件程序创建Hello.java文件:
public class Hello {
public static void main(String[] args) {
System.out.println("Hello, JDK 11 Single File Execution!");
}
}
直接运行(无需编译):
java Hello.java
输出:Hello, JDK 11 Single File Execution!
总结
JDK 11 作为 LTS 版本,在实用性和性能上都有显著提升:字符串和 File API 的增强简化了日常开发;HttpClient 的标准化提供了原生 HTTP 处理能力;var在 Lambda 中的使用提升了代码灵活性;ZGC 和 Epsilon 收集器则满足了不同场景的性能需求。这些特性使得 JDK 11 成为企业级应用的优选版本。
952

被折叠的 条评论
为什么被折叠?



