JDK11先进特性

JDK11核心特性解析

一、语言与语法增强

1. 局部变量类型推断 (var)
这是最具颠覆性的特性之一,让我们在写代码时能少打很多字,同时保持代码可读性。

// JDK 8
Map<String, List<MyVeryLongClassName>> map = new HashMap<String, List<MyVeryLongClassName>>();
InputStream is = MyClass.class.getResourceAsStream("file.txt");

// JDK 11
var map = new HashMap<String, List<MyVeryLongClassName>>(); // 编译器自动推断类型
var is = MyClass.class.getResourceAsStream("file.txt");

使用建议:

  • for-each循环和for循环中非常方便。

for (var item : list) { ... }
for (var i = 0; i < 10; i++) { ... }
  • 用于接收方法返回的复杂类型,避免书写冗长的类型声明。

  • 注意: var 只是一个语法糖,编译时类型就已确定,不是动态类型。它不能用于方法参数、返回类型或字段声明。

2. 新的字符串 API
提供了一系列非常实用的字符串处理方法,终于不用再依赖 StringUtils 这样的第三方库了。

// JDK 11
String str = "  Hello, World!  ";

// 判断字符串是否为空白 (不仅仅是空!)
boolean isBlank = str.isBlank(); // true

// 去除首尾空白 (比 trim() 更强大,能处理 Unicode 空白符)
String stripped = str.strip(); // "Hello, World!"

// 去除首部空白
String leading = str.stripLeading(); // "Hello, World!  "

// 去除尾部空白
String trailing = str.stripTrailing(); // "  Hello, World!"

// 重复字符串
String repeated = "Java ".repeat(3); // "Java Java Java "

// 按行分割字符串,返回 Stream
String lines = "a\nb\nc";
lines.lines().forEach(System.out::println); // 输出 a, b, c

二、API 增强与新增

1. 集合工厂方法 (List.ofSet.ofMap.of)
快速创建不可变的集合,代码非常简洁。

// JDK 8
List<String> jdk8List = new ArrayList<>();
jdk8List.add("A");
jdk8List.add("B");
jdk8List = Collections.unmodifiableList(jdk8List); // 使其不可变

// JDK 11
var list = List.of("A", "B", "C");
var set = Set.of("A", "B", "C");
var map = Map.of("key1", 1, "key2", 2);

// 这些集合是不可变的,任何修改操作都会抛出 UnsupportedOperationException
list.add("D"); // 运行时错误!

2. 文件读写增强 (Files 类)
一行代码读写文件,告别繁琐的 BufferedReader 和 BufferedWriter

// JDK 11 - 读取文件为字符串
String content = Files.readString(Path.of("file.txt"));

// JDK 11 - 写入字符串到文件
Files.writeString(Path.of("file.txt"), "Hello, World!");

// JDK 11 - 读取文件为字节数组
byte[] bytes = Files.readAllBytes(Path.of("image.png"));

3. Predicate.not() 静态方法
与 Stream API 结合使用,使否定条件的写法更优雅。

var list = Arrays.asList("a", "b", "", "c");

// JDK 8 - 过滤非空字符串
list.stream().filter(s -> !s.isEmpty()).forEach(System.out::println);

// JDK 11 - 使用方法引用,意图更明确
list.stream().filter(Predicate.not(String::isEmpty)).forEach(System.out::println);

4. Optional.ifPresentOrElse方法

Optional.ofNullable(null)
        .ifPresentOrElse(
            v -> System.out.println("存在值:" + v),
            () -> System.out.println("为空")
        );

三、性能与底层改进

1. HTTP Client (标准版)
取代了古老的 HttpURLConnection,提供现代、易用、支持 HTTP/2 和 WebSocket 的客户端。

// JDK 11
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create("https://httpbin.org/get"))
        .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);

2. 新的垃圾收集器 - ZGC (实验性) 和 Epsilon

  • ZGC: 一款可扩展的低延迟垃圾收集器,目标是将停顿时间控制在 10ms 以内,即使处理 TB 级堆内存。对于需要高响应性的应用(如微服务、金融交易系统)是巨大福音。

  • Epsilon: 一个“无操作”的 GC,用于性能测试、内存分配测试和短期任务,帮助你了解应用的纯内存开销。

四、开发与运维工具

1. 单文件源代码启动
可以直接运行单个 .java 文件,无需先编译。

# 假设你有一个 HelloWorld.java 文件
# JDK 8 需要:
javac HelloWorld.java
java HelloWorld

# JDK 11 只需要:
java HelloWorld.java

2. Flight Recorder (JFR) 开源并集成到 JDK
之前是商业特性,现在完全免费。它是一个低开销的性能剖析和事件收集框架,用于诊断生产环境中的性能问题。

启动命令:

java -XX:StartFlightRecording=duration=60s,filename=myrecording.jfr -jar myapp.jar

五、Java 8 → 11 的主要特性演进总览

分类新特性说明
语法层var 局部变量类型推断简化代码书写
API 增强新的 StringFilesOptionalPredicate 等方法开发更便利
并发改进 CompletableFuture更简洁的异步编程
HTTP 客户端全新的 java.net.http.HttpClient官方替代 Apache HttpClient
内存与性能ZGC、Flight Recorder、Class Data Sharing启动更快,占用更低
废弃模块移除 Java EE / CORBA / JavaFX / Nashorn更轻量、更云原生
安全性TLS 1.3 支持网络安全更强

移除 / 废弃模块(体积变轻)使得JDK 11 更轻量、云原生、容器友好。

移除项说明
Java EE(JAXB, JAX-WS 等)移出 JDK 核心,需要手动引入依赖
JavaFX需单独依赖
Nashorn JS 引擎用 GraalVM 代替
Applet API标记废弃

六、常见依赖迁移指引

原依赖(JDK 8)JDK 11 替代方案
javax.xml.bindjakarta.xml.bind-api + org.glassfish.jaxb:jaxb-runtime
javax.activationjakarta.activation-api
javax.annotationjakarta.annotation-api
javax.mailcom.sun.mail:jakarta.mail

七、实用 JVM 参数调整

# 推荐参数
-Xms512m
-Xmx1024m
-XX:+UseG1GC
-XX:+UseStringDeduplication
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/var/log/heapdump.hprof

八、JDK8迁移建议

依赖清理:
删除 javax.* 旧包依赖,改用 Jakarta 包。

若引用旧工具类(如 com.sun.*),必须删除或使用替代方案。

性能测试:
比较启动时间、内存占用、GC 日志。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值