估计很多人都跟我一样,Java 8 的新特性还没搞明白,这 Java 14 就发布了。学习节奏妥妥滴跟不上 Java 的版本更新...
不用归不用,但是 Java 14 的新特性还是需要了解下的。跟同事在一起吃饭聊天的时候,也好装个逼。
先看下 Oracle JDK 14 的更新说明:
https://www.oracle.com/technetwork/java/javase/14all-relnotes-5809668.html
页面内容很长,主要说了:
新增和增强的功能
核心类库:
会计货币格式支持
添加了一个新类java.lang.Record
阐明 ReadableByteChannel.read()方法和其他相关方法的规范
hotspot 虚拟机中的垃圾收集器:
垃圾收集器 ZGC 在 Windows、MacOS 的使用
并行 GC 的改进
G1 垃圾收集器对 NUMA-Aware 内存分配的支持
安全类库:
默认情况下禁用TLS、CertPath和Signed JAR中的弱命名曲线
Apache Santuario 库更新到版本 2.1.4
工具 javac:
默认情况下允许调用可发现的 javac 插件
ml/jaxp:
SAX ContentHandler 处理 XML 声明的新方法
删除的功能与选项
删除 sun.nio.cs.map 系统属性
删除 netscape.javascript.JSObject::getWindow 方法
删除并发标记和清除(CMS)垃圾收集器
删除不推荐使用的 java.security.acl api
删除 keytool -keyalg 的默认值
移除 Pack200 工具和 API
还包括:不推荐使用的功能、注意事项。最后补充了 Oracle JDK 与 Oracle Open JDK 之间的差异。
官方有篇博客举例说明了 Java 14 的新特性:
https://blogs.oracle.com/javamagazine/java-14-arrives-with-a-host-of-new-features
- Switch Expressions(switch 表达式可以使用箭头语法)
switch (event) {
case PLAY -> "User has triggered the play button";
case STOP, PAUSE -> "User needs a break";
default -> {
String message = event.toString();
LocalDateTime now = LocalDateTime.now();
yield "Unknown event " + message +
" logged on " + now;
}
};
- Text Blocks(文本块)
String html = "<HTML>" +
"\n\t" + "<BODY>" +
"\n\t\t" + "<H1>\"Java 14 is here!\"</H1>" +
"\n\t" + "</BODY>" +
"\n" + "</HTML>";
JDK 14 可以这样
String html = """
<HTML>
<BODY>
<H1>"Java 14 is here!"</H1>
</BODY>
</HTML>""";
- Pattern Matching for instanceof(instanceof 的匹配优化)
if (obj instanceof Group) {
Group group = (Group) obj;
// use group specific methods
List entries = group.getEntries();
}
JDK 14 可以这样
if (obj instanceof Group group) {
List entries = group.getEntries();
}
- Records(预览功能,减少冗余代码)
- Helpful NullPointerExceptions(NullPointerException 更详细的错误信息打印)
//JDK 空指针代码与 JVM 打印日志
String name = user.getLocation().getCity().getName();
Exception in thread "main" java.lang.NullPointerException
at NullPointerExample.main(NullPointerExample.java:5)
JDK 14 日志可以这样,提示更准确
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "Location.getCity()" because the return value of "User.getLocation()" is null
at NullPointerExample.main(NullPointerExample.java:5)
再来看一下 OpenJDK 里 JDK 14 的新特性:
https://openjdk.java.net/projects/jdk/14/
- 305:Pattern Matching for instanceof (Preview)
- 343:Packaging Tool (Incubator)
- 345:NUMA-Aware Memory Allocation for G1
- 349:JFR Event Streaming
- 352:Non-Volatile Mapped Byte Buffers
- 358:Helpful NullPointerExceptions
- 359:Records (Preview)
- 361:Switch Expressions (Standard)
- 362:Deprecate the Solaris and SPARC Ports
- 363:Remove the Concurrent Mark Sweep (CMS) Garbage Collector
- 364:ZGC on macOS
- 365:ZGC on Windows
- 366:Deprecate the ParallelScavenge + SerialOld GC Combination
- 367:Remove the Pack200 Tools and API
- 368:Text Blocks (Second Preview)
- 370:Foreign-Memory Access API (Incubator)
跟 Oracle JDK 14 发布的内容相似。
关于 JDK 的选择要考虑的点
- 建议使用 LTS 版本,即官方长期支持版,会一直更新到承诺维护截止日期
- 由于商业成本和软件协议,高于 JDK 8,尽量使用 OpenJDK