一、语言与语法增强
1. 局部变量类型推断 (var)
这是最具颠覆性的特性之一,让我们在写代码时能少打很多字,同时保持代码可读性。
// JDK 8
Map<String, List<MyVeryLongClassName>> map = new HashMap<String, List<MyVeryLongClassName>>();
InputStream is = MyClass.class.getResourceAsStream("file.txt");
// JDK 11
var map = new HashMap<String, List<MyVeryLongClassName>>(); // 编译器自动推断类型
var is = MyClass.class.getResourceAsStream("file.txt");
使用建议:
-
在
for-each循环和for循环中非常方便。
for (var item : list) { ... }
for (var i = 0; i < 10; i++) { ... }
-
用于接收方法返回的复杂类型,避免书写冗长的类型声明。
-
注意:
var只是一个语法糖,编译时类型就已确定,不是动态类型。它不能用于方法参数、返回类型或字段声明。
2. 新的字符串 API
提供了一系列非常实用的字符串处理方法,终于不用再依赖 StringUtils 这样的第三方库了。
// JDK 11
String str = " Hello, World! ";
// 判断字符串是否为空白 (不仅仅是空!)
boolean isBlank = str.isBlank(); // true
// 去除首尾空白 (比 trim() 更强大,能处理 Unicode 空白符)
String stripped = str.strip(); // "Hello, World!"
// 去除首部空白
String leading = str.stripLeading(); // "Hello, World! "
// 去除尾部空白
String trailing = str.stripTrailing(); // " Hello, World!"
// 重复字符串
String repeated = "Java ".repeat(3); // "Java Java Java "
// 按行分割字符串,返回 Stream
String lines = "a\nb\nc";
lines.lines().forEach(System.out::println); // 输出 a, b, c
二、API 增强与新增
1. 集合工厂方法 (List.of, Set.of, Map.of)
快速创建不可变的集合,代码非常简洁。
// JDK 8
List<String> jdk8List = new ArrayList<>();
jdk8List.add("A");
jdk8List.add("B");
jdk8List = Collections.unmodifiableList(jdk8List); // 使其不可变
// JDK 11
var list = List.of("A", "B", "C");
var set = Set.of("A", "B", "C");
var map = Map.of("key1", 1, "key2", 2);
// 这些集合是不可变的,任何修改操作都会抛出 UnsupportedOperationException
list.add("D"); // 运行时错误!
2. 文件读写增强 (Files 类)
一行代码读写文件,告别繁琐的 BufferedReader 和 BufferedWriter。
// JDK 11 - 读取文件为字符串
String content = Files.readString(Path.of("file.txt"));
// JDK 11 - 写入字符串到文件
Files.writeString(Path.of("file.txt"), "Hello, World!");
// JDK 11 - 读取文件为字节数组
byte[] bytes = Files.readAllBytes(Path.of("image.png"));
3. Predicate.not() 静态方法
与 Stream API 结合使用,使否定条件的写法更优雅。
var list = Arrays.asList("a", "b", "", "c");
// JDK 8 - 过滤非空字符串
list.stream().filter(s -> !s.isEmpty()).forEach(System.out::println);
// JDK 11 - 使用方法引用,意图更明确
list.stream().filter(Predicate.not(String::isEmpty)).forEach(System.out::println);
4. Optional.ifPresentOrElse方法
Optional.ofNullable(null)
.ifPresentOrElse(
v -> System.out.println("存在值:" + v),
() -> System.out.println("为空")
);
三、性能与底层改进
1. HTTP Client (标准版)
取代了古老的 HttpURLConnection,提供现代、易用、支持 HTTP/2 和 WebSocket 的客户端。
// JDK 11
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://httpbin.org/get"))
.build();
// 同步调用
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
// 异步调用
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::body)
.thenAccept(System.out::println);
2. 新的垃圾收集器 - ZGC (实验性) 和 Epsilon
-
ZGC: 一款可扩展的低延迟垃圾收集器,目标是将停顿时间控制在 10ms 以内,即使处理 TB 级堆内存。对于需要高响应性的应用(如微服务、金融交易系统)是巨大福音。
-
Epsilon: 一个“无操作”的 GC,用于性能测试、内存分配测试和短期任务,帮助你了解应用的纯内存开销。
四、开发与运维工具
1. 单文件源代码启动
可以直接运行单个 .java 文件,无需先编译。
# 假设你有一个 HelloWorld.java 文件
# JDK 8 需要:
javac HelloWorld.java
java HelloWorld
# JDK 11 只需要:
java HelloWorld.java
2. Flight Recorder (JFR) 开源并集成到 JDK
之前是商业特性,现在完全免费。它是一个低开销的性能剖析和事件收集框架,用于诊断生产环境中的性能问题。
启动命令:
java -XX:StartFlightRecording=duration=60s,filename=myrecording.jfr -jar myapp.jar
五、Java 8 → 11 的主要特性演进总览
| 分类 | 新特性 | 说明 |
|---|---|---|
| 语法层 | var 局部变量类型推断 | 简化代码书写 |
| API 增强 | 新的 String、Files、Optional、Predicate 等方法 | 开发更便利 |
| 并发 | 改进 CompletableFuture | 更简洁的异步编程 |
| HTTP 客户端 | 全新的 java.net.http.HttpClient | 官方替代 Apache HttpClient |
| 内存与性能 | ZGC、Flight Recorder、Class Data Sharing | 启动更快,占用更低 |
| 废弃模块 | 移除 Java EE / CORBA / JavaFX / Nashorn | 更轻量、更云原生 |
| 安全性 | TLS 1.3 支持 | 网络安全更强 |
移除 / 废弃模块(体积变轻)使得JDK 11 更轻量、云原生、容器友好。
| 移除项 | 说明 |
|---|---|
| Java EE(JAXB, JAX-WS 等) | 移出 JDK 核心,需要手动引入依赖 |
| JavaFX | 需单独依赖 |
| Nashorn JS 引擎 | 用 GraalVM 代替 |
| Applet API | 标记废弃 |
六、常见依赖迁移指引
| 原依赖(JDK 8) | JDK 11 替代方案 |
|---|---|
javax.xml.bind | jakarta.xml.bind-api + org.glassfish.jaxb:jaxb-runtime |
javax.activation | jakarta.activation-api |
javax.annotation | jakarta.annotation-api |
javax.mail | com.sun.mail:jakarta.mail |
七、实用 JVM 参数调整
# 推荐参数
-Xms512m
-Xmx1024m
-XX:+UseG1GC
-XX:+UseStringDeduplication
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/var/log/heapdump.hprof
八、JDK8迁移建议
依赖清理:
删除 javax.* 旧包依赖,改用 Jakarta 包。
若引用旧工具类(如 com.sun.*),必须删除或使用替代方案。
性能测试:
比较启动时间、内存占用、GC 日志。
JDK11核心特性解析
901

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



