Java11 新特性
Java 11 是继 Java 8 之后的另一个长期支持(LTS)版本,于 2018 年 9 月 25 日发布,相对于 Java 8 引入了多项重要的语言特性、性能优化、API 改进和模块化支持。以下是对 Java 11 相比 Java 8 的主要新特性和提升的简洁总结,涵盖核心变化:
1. 语言特性改进
- 局部变量类型推断(var,JEP 323,Java 10 引入)
使用 var 关键字简化局部变量声明,编译器自动推断类型。
示例:
var list = new ArrayList<String>(); *// 推断为 ArrayList<String>* var stream = list.stream(); *// 推断为 Stream<String>*
Java 8 无此功能,需显式声明类型,代码较冗长。
- Lambda 参数的局部变量语法(JEP 323,Java 11 扩展)
允许在 Lambda 表达式中使用 var。
(var x, var y) -> x + y
Java 8 的 Lambda 表达式不支持 var,需显式指定类型。
2. 模块化系统(Project Jigsaw)
- Java 模块化系统(JPMS,JEP 261,Java 9 引入)
引入模块化机制,允许开发者定义模块,增强封装性,减少依赖冲突(“JAR Hell”)。
示例模块声明:
module com.example { requires java.base; exports com.example.api; }
Java 11 完善了模块化支持,提供了 jlink 和 jmod 工具,用于创建定制化 JRE。
Java 8 完全依赖 classpath,无模块化支持。
- jlink 和 jmods(Java 9 引入,Java 11 优化)
- jlink 允许生成包含应用所需模块的精简 JRE,减少运行时体积。
- Java 8 需使用完整 JRE 或第三方工具实现类似功能。
3. API 和标准库增强
- 新 HTTP 客户端(JEP 321,Java 11 引入)
提供现代化的 HttpClient,支持 HTTP/2 和 WebSocket,取代老旧的 HttpURLConnection。
示例:
HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://example.com")) .build(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
Java 8 仅支持 HttpURLConnection,功能有限且不支持异步操作。
- 字符串 API 增强
新增方法如 String.isBlank()、String.lines()、String.strip() 等,简化字符串处理。
String s = " Hello \n"; System.out.println(s.isBlank()); *// false* System.out.println(s.strip()); *// "Hello"* s.lines().forEach(System.out::println); *// 按行处理*
Java 8 的字符串处理功能较基础,需手动实现类似逻辑。
- 集合 API 改进
新增 Collection.toArray(IntFunction),简化数组转换。
List<String> list = List.of("a", "b"); String[] array = list.toArray(String[]::new);
Java 8 需使用 toArray(new String[0]) 等方式,较繁琐。
- Optional 增强
新增 Optional.isEmpty() 和 Optional.or() 方法。
Optional<String> opt = Optional.empty(); System.out.println(opt.isEmpty()); *// true*
Java 8 的 Optional 功能较基础。
- Files 工具类增强
新增 Files.writeString 和 Files.readString 方法,简化文件读写。
Files.writeString(Path.of("file.txt"), "Hello"); String content = Files.readString(Path.of("file.txt"));
Java 8 需使用 BufferedReader 或 Files.readAllBytes 等,代码更复杂。
4. 性能和 JVM 优化
- 垃圾回收(GC)改进
- G1 垃圾收集器成为默认(Java 9 引入,Java 11 优化),取代 Java 8 的 Parallel GC,适合大内存应用,暂停时间更可预测。
- Epsilon GC(JEP 318,Java 11):无操作垃圾收集器,适合短生命周期或性能测试场景。
- ZGC(JEP 333,Java 11 实验性):低延迟垃圾收集器,支持亚毫秒级暂停。
- Java 8 的 CMS 和 Parallel GC 在高并发场景下暂停时间较长。
- 动态类文件常量(JEP 309,Java 11)
- 支持动态常量,提高字节码灵活性,优化 JIT 编译。
- Java 8 无此功能,字节码优化较弱。
- Flight Recorder(JFR,JEP 328,Java 11)
- 提供低开销的性能监控和诊断工具,适合生产环境。
- Java 8 的 JFR 需商业许可,功能受限。
5. 安全性和其他改进
- TLS 1.3 支持(JEP 332,Java 11)
- 提供更强的加密协议和性能,取代 Java 8 的 TLS 1.2。
- Unicode 10 支持
- 增强 Character 和 String 类,支持新的 Unicode 标准(如表情符号)。
- Java 8 支持 Unicode 8,功能较旧。
- 嵌套访问控制(JEP 181,Java 11)
- 改进反射 API,支持嵌套类访问,简化反射代码。
- Java 8 的反射机制较为复杂。
6. 移除和弃用
- 移除 Java EE 和 CORBA 模块(JEP 320,Java 11)
- Java 11 移除 java.xml.ws、java.corba 等模块,推荐使用独立库(如 Jakarta EE)。
- Java 8 包含这些模块,但已不推荐使用。
- 移除 pack200 和 unpack200(JEP 336,Java 11 弃用)
- 这些工具在 Java 8 中用于 JAR 文件压缩,但在 Java 11 中标记为弃用。
- 移除部分老旧 API
- 如 Thread.destroy() 和 Thread.stop(Throwable) 被移除,推荐使用现代并发工具。
- Java 8 仍包含这些不安全的 API。
7. 工具和生态系统
- 单文件程序运行(JEP 330,Java 11)
支持直接运行单个 Java 源文件,无需编译。
java HelloWorld.java
Java 8 需先编译再运行(javac 和 java 分开)。
- JShell 增强(Java 9 引入,Java 11 优化)
- JShell 提供交互式 REPL 环境,便于快速测试代码。
- Java 8 无 JShell,测试代码需编写完整程序。
- JavaFX 分离
- Java 11 将 JavaFX 从 JDK 中移除,需单独引入(如 OpenJFX)。
- Java 8 包含 JavaFX,但集成较松散。
8. 迁移注意事项
- 不兼容性
- 移除 Java EE 模块和某些 API 可能导致老项目迁移困难,需引入外部依赖。
- 模块化系统可能要求调整类路径或添加 module-info.java。
- 长期支持
- Java 11 是 LTS 版本(支持至 2026 年或更久),而 Java 8 的官方支持已于 2025 年结束(部分供应商延长支持)。
- Java 11 与现代框架(如 Spring Boot 2.x)兼容性更好。
总结
Java 11 相较 Java 8 的核心提升包括:模块化系统(JPMS)增强封装性和部署效率;新 HTTP 客户端和字符串/集合 API 改进简化开发;局部变量类型推断(var)提升代码简洁性;G1 和 ZGC 优化性能;TLS 1.3 和其他安全改进增强可靠性。Java 11 移除了一些过时功能(如 Java EE 模块),推动现代化开发,适合需要长期支持和现代特性的项目。