Java 11 是继 Java8之后的第二个 LTS 版本,于2018年9月发布,这个版本的重点是提供更好的开发体验和更强大的标准库功能,特别是在字符串处理、文件操作和 HTTP 客户端方面,增加了不少新方法。

HTTP 客户端 API

HTTP 请求是后端开发常用的能力,之前我们只能基于内置的 HttpURLConnection 自己封装,或者使用 Apache HttpClient、OkHttp 第三方库。

Java 11 将 HTTP 客户端 API正式化,新的 HTTP 客户端提供了现代化的、支持 HTTP/2 和 WebSocket 的客户端实现,让网络编程变得简单。

支持发送同步和异步请求,能够轻松获取响应结果

还支持自定义响应处理和 WebSocket 请求:

上面这些代码都不用记,现在直接把接口文档甩给 AI,让它来帮你生成请求代码就好。

String 类的新方法

Java 11 为 String 类添加了许多实用的方法,让字符串处理变得更加方便。我估计很多现在学 Java 的同学都已经区分不出来哪些是新增的方法、哪些是老方法了,反正能用就行~

  1. 基本的字符串检查和处理:

  2. strip方法

可以去除首尾空格,与之前的trim的区别是还可以去除unicode编码的空白字符,例如:

  1. lines() 方法,让多行字符串处理更简单:

  2. repeat方法:字符串重复的次数

Files 类的新方法

Java 11 为文件操作新增了更便捷的方法,不需要使用 FileReader/fileWriter 这种复杂的操作了。基本的文件读写操作,一个方法搞定:

支持流式读取文件,适合文件较大的场景:

Optional 的新方法

Java 11 为 Optional 类添加了 isEmpty()方法,和之前的 isPresent 正好相反,让空值检查更直观。

lambda表达式中的变量类型推断

jdk11中允许在lambda表达式的参数中使用var修饰。用处不大,因为大多数情况写参数名就够了

函数式接口:

测试类:

基于嵌套的访问控制

Java 11 改进了嵌套类的访问控制,编译器不再需要生成合成的桥接方法来访问私有成员

这个改进主要影响字节码生成,对开发者来说是透明的,但可以减少生成的类文件数量。

动态类文件常量

Java 11 在字节码层面引入了动态常量,这是一个底层特性,主要用于优化

  • Lambda 表达式的性能

  • 字符串连接操作

  • 方法句柄的使用

对普通开发者来说这个特性是透明的,但可以提升运行时性能。

Flight Recorder

Java Flight Recorder (FR)是一个低开销的事件记录框架,在 Java 11 中开源并免费使用:

JFR 可以记录:

  • GC 事件

  • 线程活动

  • 方法调用

  • I/O 操作

  • 系统信息

生成的 .jfr 文件可以用 Java Mission Control (MC) 分析。

启动单文件源代码程序

Java 11 支持直接运行单个 .java 文件,无需先编译

在以前的版本中,在命令提示下,需要先编译,生成class文件之后再运行,例如:

在Java 11中,可以这样直接运行,当然这样直接运行是不产生字节码文件的

这个特性主要用于

  • 脚本编写

  • 快速原型开发

  • 教学演示

低开销堆分析

Java 11 引入了低开销的堆分析工具,可以通过 JVM 参数启用

相比传统的堆转储,这种方式:

  • 开销更低

  • 可以持续监控

  • 提供更详细的分配信息

ZGC 可扩展低延迟垃圾收集器

Java 11引入了 ZGC(Z Garbage Collector)作为实验特性,这是一个可扩展的低延迟垃圾收集器:

ZGC 的特点:

  • 超低延迟:暂停时间通常小于 10ms.

  • 可扩展:支持几TB到16TB的堆大小

  • 并发:大部分工作与应用线程并发执行

ZGC 适用于对延迟敏感的应用,如实时系统、高频交易等。

TLS 1.3

Java 11 支持最新的 TLS 1.3 协议,提供更好的安全性和性能

TLS 1.3 的优势:

  • 更少的握手往返

  • 更强的加密算法

  • 更好的前向保密性

Unicode 10

Java 11 支持 Unicode 10.00.,新增了大量字符和表情符号

Epsilon 无操作垃圾收集器

Java 11 引入了 Epsilon GC,这是一个“无操作"的垃圾收集器

Epsilon GC 的特点

  • 不进行垃圾回收:只分配内存,不回收

  • 最低开销:没有 GC 暂停

  • 测试用途:主要用于性能测试和短期运行的应用

适用场景:

  • 性能基准测试

  • 内存压力测试

  • 短期运行的批处理任务