Java 11与Java 8有什么区别?
Java 11 是 Java 8 之后的一个重要长期支持(LTS)版本,在保持向后兼容性的同时,引入了许多新特性、优化和废弃项。以下是两者的主要区别:
1. 语言特性增强
局部变量类型推断(var
,Java 10 引入,Java 11 延续)
Java 11 支持在局部变量声明中使用 var
,编译器会自动推断类型,简化代码:
// Java 8
String message = "Hello";
List<Integer> numbers = new ArrayList<>();// Java 11
var message = "Hello"; // 推断为 String
var numbers = new ArrayList<Integer>(); // 推断为 ArrayList<Integer>
2. 标准库改进
字符串增强方法
Java 11 为 String
类新增了多个实用方法:
// Java 11 新增
String str = " hello ";
str.isBlank(); // 检查是否为空白字符(包括空格、制表符等)→ true
str.strip(); // 去除首尾空白(比 trim() 更智能,支持 Unicode)→ "hello"
str.stripLeading(); // 去除首部空白 → "hello "
str.stripTrailing(); // 去除尾部空白 → " hello"
str.repeat(3); // 重复字符串 → " hello hello hello "
Optional
增强
Optional
新增了 isEmpty()
方法,更直观地判断是否为空:
// Java 8
Optional<String> opt = Optional.empty();
if (!opt.isPresent()) { ... }// Java 11
if (opt.isEmpty()) { ... } // 更简洁
3. HTTP 客户端(标准化,Java 11)
Java 11 将 Java 9 中引入的 HttpClient
从孵化阶段正式纳入标准库,支持同步和异步 HTTP 请求,替代老旧的 HttpURLConnection
:
// Java 11 HTTP 客户端示例
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder().uri(URI.create("https://example.com")).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).join();
4. 移除与废弃
- 移除项:Java 11 移除了 Java 8 中的
永久代(PermGen)
,完全使用元空间(Metaspace)
替代(元空间在 Java 8 中引入,作为永久代的替代品)。 - 废弃项:
Thread.stop()
、sun.misc.Unsafe
等不安全方法被标记为废弃,推荐使用更安全的替代方案。 - 移除 CORBA 和 Java EE 模块:Java 11 移除了
java.corba
、java.xml.ws
等模块,这些功能需通过第三方库获取。
5. 性能与工具优化
- ZGC 垃圾收集器:Java 11 引入实验性的 ZGC(低延迟垃圾收集器),支持 TB 级内存,暂停时间不超过 10ms。
- Epsilon 垃圾收集器:一个“无操作”收集器,用于性能测试和短期任务,不进行垃圾回收。
- JDK 自带工具增强:
jlink
(用于创建自定义 JRE)、jhsdb
(调试工具)等功能更强大。
6. 其他重要变化
- 单文件程序运行:Java 11 支持直接运行单文件 Java 程序(无需先编译):
# Java 11 可直接运行 .java 文件 java HelloWorld.java
- 模块化系统:继承 Java 9 引入的模块系统(
module-info.java
),更好地管理代码依赖和封装。
总结
Java 11 在 Java 8 的基础上,通过简化语法(var
)、增强标准库(字符串、Optional
)、引入新特性(HTTP 客户端、ZGC)、优化性能等方式提升了开发效率和系统性能,同时移除了过时功能以保持语言活力。对于长期项目,从 Java 8 迁移到 Java 11 是一个常见且推荐的选择(两者均为 LTS 版本)。