Java 11 新特性详细教程
Java 11 是 Java 社区的一个重要版本,于 2018 年 9 月发布,作为 长期支持版本(LTS),继承了 Java 8 和 Java 9 的特性,同时新增了许多实用功能。Java 11 提供了生产环境级别的稳定性和现代化编程功能,是现代 Java 开发的首选之一。
本文将详细讲解 Java 11 的新特性、示例代码以及其实际应用场景,帮助读者全面掌握 Java 11。
目录
1. 局部变量类型推断(增强版 var
)
1.1 什么是 var
?
var
是 Java 10 引入的局部变量类型推断关键字,允许编译器根据初始化表达式自动推断变量的类型。这一功能在 Java 11 中得到增强,支持在 Lambda 表达式的参数 中使用 var
。
1.2 Java 11 的改进
在 Java 11 中,Lambda 表达式的参数可以使用 var
,从而支持附加注解(例如 @Nullable
、@NonNull
等)。
示例
import java.util.List;
public class VarExample {
public static void main(String[] args) {
// 使用 var 声明局部变量
var list = List.of("Java", "Python", "C++");
list.forEach(System.out::println);
// 在 Lambda 参数中使用 var
list.forEach((@Deprecated var language) -> System.out.println(language + " is awesome!"));
}
}
输出:
Java
Python
C++
Java is awesome!
Python is awesome!
C++ is awesome!
注意事项
var
只能用于局部变量,不能用于类级别的字段或方法参数。- Lambda 参数中必须一致使用
var
或一致省略类型。
2. 字符串处理增强
Java 11 对 String
类进行了增强,添加了许多实用方法,简化了常见的字符串操作。
2.1 新增方法
-
isBlank()
:- 判断字符串是否为空白字符串(包括空字符串和仅包含空白字符)。
System.out.println("".isBlank()); // true System.out.println(" ".isBlank()); // true System.out.println("Java".isBlank()); // false
-
lines()
:- 将多行字符串分割成
Stream
。
var multiline = "Java 11\nis\nawesome!"; multiline.lines().forEach(System.out::println);
- 将多行字符串分割成
-
strip()
:- 去除字符串首尾的空白字符,比
trim()
更强大,支持 Unicode 空白字符。
System.out.println(" hello ".strip()); // "hello" System.out.println(" hello ".stripLeading()); // "hello " System.out.println(" hello ".stripTrailing());// " hello"
- 去除字符串首尾的空白字符,比
-
repeat()
:- 重复字符串指定次数。
System.out.println("Java".repeat(3)); // "JavaJavaJava"
3. 新 HTTP Client API
Java 11 为 HTTP 客户端提供了新的 API,替代了旧的 HttpURLConnection
,更加现代化、易用、支持异步和 HTTP/2。
3.1 基本使用
发送同步 GET 请求:
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
public class HttpClientExample {
public static void main(String[] args) throws Exception {
// 创建 HttpClient
var client = HttpClient.newHttpClient();
// 创建 HttpRequest
var request = HttpRequest.newBuilder()
.uri(URI.create("https://api.github.com"))
.GET()
.build();
// 发送请求并接收响应
var response = client.send(request, HttpResponse.BodyHandlers.ofString());
// 打印响应
System.out.println("Response code: " + response.statusCode());
System.out.println("Response body: " + response.body());
}
}
发送异步请求:
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::body)
.thenAccept(System.out::println)
.join();
4. 运行 Java 文件的新方式
Java 11 支持直接运行 .java
文件,无需显式编译为 .class
文件。这简化了小程序或脚本的运行流程。
示例
文件:HelloWorld.java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, Java 11!");
}
}
直接运行:
java HelloWorld.java
输出:
Hello, Java 11!
5. 废弃和移除的特性
5.1 废弃特性
-
Java EE 和 CORBA:
- Java 11 完全移除了 Java EE 和 CORBA 模块。
- 替代方案:可以使用 Jakarta EE。
-
Applets:
Applets
已被废弃,现代浏览器不再支持。
5.2 java.se.ee
模块的移除
从 Java 11 开始,java.se.ee
模块被移除,涉及以下模块:
java.xml.ws
java.xml.bind
java.activation
6. 垃圾回收改进
6.1 ZGC(Z Garbage Collector)
-
特点:超低延迟,GC 暂停时间通常小于 10 毫秒。
-
适用场景:大内存、高并发应用。
-
启用方式:
java -XX:+UseZGC MyApp
6.2 Epsilon GC
-
特点:无垃圾回收,仅用于测试性能或短命进程。
-
启用方式:
java -XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC MyApp
7. 新增强的 API
7.1 Files 类的新方法
-
writeString()
和readString()
:
简化了文件的读写操作。import java.nio.file.Files; import java.nio.file.Path; public class FileExample { public static void main(String[] args) throws Exception { var path = Path.of("example.txt"); // 写入文件 Files.writeString(path, "Hello, Java 11!"); // 读取文件 var content = Files.readString(path); System.out.println(content); } }
7.2 Optional 类增强
-
isEmpty()
:
判断Optional
是否为空。var optional = Optional.empty(); System.out.println(optional.isEmpty()); // true
-
or()
:
提供备用值。var optional = Optional.ofNullable(null); optional.or(() -> Optional.of("Default")).ifPresent(System.out::println);
8. 多版本 Jar 支持
Java 11 支持在一个 Jar 文件中针对不同的 Java 版本提供不同的实现。
目录结构
example.jar
├─ META-INF/
│ ├─ versions/
│ │ ├─ 9/
│ │ ├─ 11/
通过此功能,开发者可以在一个 Jar 包中支持多版本的 JDK。