通关我贼溜
155.11M · 2026-02-19
JDK 11(2018年9月发布)是Java的长期支持(LTS)版本,引入了多项重要特性和性能改进。作为继JDK 8之后的又一个LTS版本,JDK 11在保持兼容性的同时,提供了更现代、更高效的API和工具,为Java开发者带来了更好的开发体验和性能表现。
特性说明:
核心组件:
HttpClient:HTTP客户端,负责发送请求和处理响应HttpRequest:HTTP请求,包含请求URI、方法、头部等HttpResponse:HTTP响应,包含状态码、头部、响应体等BodyHandlers:响应体处理器,用于处理不同类型的响应体代码示例:
// 创建HTTP客户端
HttpClient client = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_2) // 使用HTTP/2
.followRedirects(HttpClient.Redirect.NORMAL)
.build();
// 创建HTTP请求
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://httpbin.org/json"))
.header("User-Agent", "Java11-HttpClient")
.GET() // GET请求
.build();
// 发送同步请求
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
System.out.println("状态码: " + response.statusCode());
System.out.println("响应头: " + response.headers().map());
System.out.println("响应体: " + response.body().substring(0, 100) + "...");
// 发送异步请求
CompletableFuture<HttpResponse<String>> futureResponse =
client.sendAsync(request, BodyHandlers.ofString());
futureResponse.thenApply(HttpResponse::body)
.thenAccept(body -> System.out.println("异步响应: " + body.substring(0, 50) + "..."))
.join(); // 等待异步操作完成
性能优势:
适用场景:
特性说明:
var关键字允许编译器根据初始化值推断局部变量类型使用规则:
代码示例:
// 传统方式 - 显式类型声明
String traditionalString = "Hello World";
List<String> traditionalList = List.of("A", "B", "C");
Map<String, Integer> traditionalMap = Map.of("A", 1, "B", 2);
// 使用var - 编译器推断类型
var inferredString = "Hello World"; // 推断为String
var inferredList = List.of("A", "B", "C"); // 推断为List<String>
var inferredMap = Map.of("A", 1, "B", 2); // 推断为Map<String, Integer>
var inferredNumber = 42; // 推断为int
System.out.println("var字符串: " + inferredString);
System.out.println("var列表: " + inferredList);
System.out.println("var映射: " + inferredMap);
System.out.println("var数字: " + inferredNumber);
// 在循环中使用var
for (var item : inferredList) {
System.out.println("循环项: " + item);
}
// 在try-with-resources中使用var
try (var input = JDK11Features.class.getResourceAsStream("/test.txt")) {
if (input != null) {
var content = new String(input.readAllBytes());
System.out.println("文件内容: " + content);
}
} catch (IOException e) {
System.out.println("文件读取错误");
}
// 注意事项:var不能用于以下情况
// var nullVar = null; // 错误:无法推断类型
// var lambda = (x, y) -> x + y; // 错误:lambda表达式需要显式类型
// var array = {1, 2, 3}; // 错误:数组初始化需要显式类型
性能优势:
适用场景:
特性说明:
isBlank() - 检查字符串是否为空或仅包含空白字符strip()/stripLeading()/stripTrailing() - 去除前后空白,比trim()更Unicode友好repeat(int) - 重复字符串指定次数lines() - 将多行字符串转换为Stream代码示例:
var text = " Hello Java 11 ";
var multilineText = "第一行n第二行n第三行";
// isBlank() - 检查字符串是否为空或仅包含空白字符
System.out.println("isBlank检查: '" + text + "' -> " + text.isBlank()); // 输出: false
System.out.println("isBlank检查: ' ' -> " + " ".isBlank()); // 输出: true
// strip() - 去除前后空白(比trim()更Unicode友好)
System.out.println("strip结果: '" + text.strip() + "'"); // 输出: 'Hello Java 11'
System.out.println("stripLeading: '" + text.stripLeading() + "'"); // 输出: 'Hello Java 11 '
System.out.println("stripTrailing: '" + text.stripTrailing() + "'"); // 输出: ' Hello Java 11'
// repeat() - 重复字符串
System.out.println("repeat: '" + "Java".repeat(3) + "'"); // 输出: 'JavaJavaJava'
// lines() - 将多行文本转换为Stream
System.out.println("lines转换:");
multilineText.lines()
.map(line -> "行: " + line)
.forEach(System.out::println);
// 输出:
// 行: 第一行
// 行: 第二行
// 行: 第三行
性能优势:
lines()方法直接返回Stream,避免了中间数组创建strip()方法支持Unicode空白字符,比trim()更全面且性能相当适用场景:
特性说明:
Files.writeString() - 直接将字符串写入文件,无需转换为字节数组Files.readString() - 直接从文件读取字符串,无需手动处理字符编码代码示例:
// 创建临时文件
Path tempFile = Files.createTempFile("jdk11", ".txt");
// 写入文件 - Files.writeString:JDK 11新增,直接写入字符串
String content = "这是使用JDK 11新API写入的内容n第二行内容";
Files.writeString(tempFile, content);
// 读取文件 - Files.readString:JDK 11新增,直接读取字符串
String readContent = Files.readString(tempFile);
System.out.println("读取的文件内容:n" + readContent);
// 清理临时文件
Files.deleteIfExists(tempFile);
性能优势:
适用场景:
特性说明:
代码示例:
// ZGC主要是JVM层面的改进,不需要代码更改
// 但可以通过以下方式验证ZGC是否启用
String gcName = System.getProperty("java.vm.gc");
System.out.println("当前GC: " + gcName);
// 获取JVM名称和版本信息
String vmName = System.getProperty("java.vm.name");
String vmVersion = System.getProperty("java.vm.version");
System.out.println("JVM名称: " + vmName);
System.out.println("JVM版本: " + vmVersion);
// 获取垃圾收集器信息
List<GarbageCollectorMXBean> gcBeans = ManagementFactory.getGarbageCollectorMXBeans();
for (GarbageCollectorMXBean gcBean : gcBeans) {
System.out.println("GC名称: " + gcBean.getName());
System.out.println("GC算法: " + gcBean.getObjectName());
}
// 创建大量对象来观察GC行为
List<byte[]> memoryChunks = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
// 分配1MB内存
memoryChunks.add(new byte[1024 * 1024]);
if (i % 100 == 0) {
System.out.println("已分配: " + i + " MB");
}
}
启用方式:
java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC YourApplication
性能优势:
适用场景:
java命令直接执行源代码文件| 特性 | 性能提升 | 适用场景 |
|---|---|---|
| HTTP Client API | 比旧版HttpURLConnection快仨-5倍,支持HTTP/2多路复用 | REST API调用、微服务通信 |
| 局部变量类型推断 | 编译时类型推断,运行时无性能开销,减少代码冗余 | 提高代码可读性的场景 |
| 新的字符串方法 | 内置优化算法,减少内存拷贝,支持Unicode | 字符串处理、文本操作 |
| 新的文件方法 | 减少字节数组转换,优化I/O操作 | 文本文件读写、配置处理 |
| ZGC | 暂停时间稳定在亚毫秒级别,支持TB级堆内存 | 大内存、低延迟应用 |
| Epsilon GC | 无GC操作,适合性能测试 | 性能基准测试 |
| Flight Recorder | 低开销性能坚控,低于1%的性能影响 | 生产环境坚控、问题诊断 |
package com.java.learning;
import java.lang.management.GarbageCollectorMXBean;
import java.lang.management.ManagementFactory;
import java.net.URI;
import java.net.http.*;
import java.net.http.HttpResponse.BodyHandlers;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
public class JDK11Features {
public static void main(String[] args) throws Exception {
demonstrateHttpClient();
demonstrateLocalVariableTypeInference();
demonstrateStringMethods();
demonstrateFileMethods();
ZGCDemo.demonstrateZGC();
}
public static void demonstrateHttpClient() throws Exception {
System.out.println("=== HTTP Client API示例 ===");
// 创建HTTP客户端
HttpClient client = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_2)
.followRedirects(HttpClient.Redirect.NORMAL)
.build();
// 创建HTTP请求
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://httpbin.org/json"))
.header("User-Agent", "Java11-HttpClient")
.GET()
.build();
// 发送同步请求
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
System.out.println("状态码: " + response.statusCode());
System.out.println("响应头: " + response.headers().map());
System.out.println("响应体: " + response.body().substring(0, 100) + "...");
// 发送异步请求
CompletableFuture<HttpResponse<String>> futureResponse =
client.sendAsync(request, BodyHandlers.ofString());
futureResponse.thenApply(HttpResponse::body)
.thenAccept(body -> System.out.println("异步响应: " + body.substring(0, 50) + "..."))
.join(); // 等待异步操作完成
}
public static void demonstrateLocalVariableTypeInference() {
System.out.println("n=== 局部变量类型推断 (var) 示例 ===");
// 传统方式 - 显式类型声明
String traditionalString = "Hello World";
List<String> traditionalList = List.of("A", "B", "C");
Map<String, Integer> traditionalMap = Map.of("A", 1, "B", 2);
// 使用var - 编译器推断类型
var inferredString = "Hello World"; // 推断为String
var inferredList = List.of("A", "B", "C"); // 推断为List<String>
var inferredMap = Map.of("A", 1, "B", 2); // 推断为Map<String, Integer>
var inferredNumber = 42; // 推断为int
System.out.println("var字符串: " + inferredString);
System.out.println("var列表: " + inferredList);
System.out.println("var映射: " + inferredMap);
System.out.println("var数字: " + inferredNumber);
// 在循环中使用var
for (var item : inferredList) {
System.out.println("循环项: " + item);
}
// 在try-with-resources中使用var
try (var input = JDK11Features.class.getResourceAsStream("/test.txt")) {
if (input != null) {
var content = new String(input.readAllBytes());
System.out.println("文件内容: " + content);
}
} catch (IOException e) {
System.out.println("文件读取错误");
}
// 注意事项:var不能用于以下情况
// var nullVar = null; // 错误:无法推断类型
// var lambda = (x, y) -> x + y; // 错误:lambda表达式需要显式类型
// var array = {1, 2, 3}; // 错误:数组初始化需要显式类型
}
public static void demonstrateStringMethods() {
System.out.println("n=== 新的字符串方法示例 ===");
var text = " Hello Java 11 ";
var multilineText = "第一行n第二行n第三行";
// isBlank() - 检查字符串是否为空或仅包含空白字符
System.out.println("isBlank检查: '" + text + "' -> " + text.isBlank());
System.out.println("isBlank检查: ' ' -> " + " ".isBlank());
// strip() - 去除前后空白(比trim()更Unicode友好)
System.out.println("strip结果: '" + text.strip() + "'");
System.out.println("stripLeading: '" + text.stripLeading() + "'");
System.out.println("stripTrailing: '" + text.stripTrailing() + "'");
// repeat() - 重复字符串
System.out.println("repeat: '" + "Java".repeat(3) + "'");
// lines() - 将多行文本转换为Stream
System.out.println("lines转换:");
multilineText.lines()
.map(line -> "行: " + line)
.forEach(System.out::println);
}
public static void demonstrateFileMethods() throws IOException {
System.out.println("n=== 新的文件方法示例 ===");
// 创建临时文件
Path tempFile = Files.createTempFile("jdk11", ".txt");
// 写入文件 - Files.writeString:JDK 11新增,直接写入字符串
String content = "这是使用JDK 11新API写入的内容n第二行内容";
Files.writeString(tempFile, content);
// 读取文件 - Files.readString:JDK 11新增,直接读取字符串
String readContent = Files.readString(tempFile);
System.out.println("读取的文件内容:n" + readContent);
// 清理临时文件
Files.deleteIfExists(tempFile);
}
}
// ZGC演示(需要JVM参数:-XX:+UnlockExperimentalVMOptions -XX:+UseZGC)
class ZGCDemo {
public static void demonstrateZGC() {
// ZGC主要是JVM层面的改进,不需要代码更改
// 但可以通过以下方式验证ZGC是否启用
String gcName = System.getProperty("java.vm.gc");
System.out.println("当前GC: " + gcName);
// 获取JVM名称和版本信息
String vmName = System.getProperty("java.vm.name");
String vmVersion = System.getProperty("java.vm.version");
System.out.println("JVM名称: " + vmName);
System.out.println("JVM版本: " + vmVersion);
List<GarbageCollectorMXBean> gcBeans = ManagementFactory.getGarbageCollectorMXBeans();
for (GarbageCollectorMXBean gcBean : gcBeans) {
System.out.println("GC名称: " + gcBean.getName());
System.out.println("GC算法: " + gcBean.getObjectName());
}
// 创建大量对象来观察GC行为
List<byte[]> memoryChunks = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
// 分配1MB内存
memoryChunks.add(new byte[1024 * 1024]);
if (i % 100 == 0) {
System.out.println("已分配: " + i + " MB");
}
}
}
}
JDK 11作为长期支持(LTS)版本,引入了多项重要特性和性能改进,为Java开发者带来了更好的开发体验和性能表现。从HTTP Client API到ZGC垃圾收集器,从局部变量类型推断到新的字符串和文件方法,这些特性不仅使代码更简洁、更易读,还显著提升了应用程序的性能。
通过合理使用JDK 11的新特性,开发者可以:
JDK 11的发布标志着Java平台的持续演进,为Java在现代应用开发中保持竞争力奠定了基础。对于企业应用和长期项目,升级到JDK 11可以获得更好的性能、更丰富的功能和更长的支持周期,是一个值得考虑的选择。