从 JDK 9 到 JDK 16,Java 每个版本都带来了不少新特性。以下是各版本的主要更新汇总:
✅ JDK 9(2017年9月)
-
模块系统(Project Jigsaw):引入模块化,支持将代码组织为模块,提升可维护性和性能。
-
JShell:交互式 REPL 工具,支持即时运行 Java 代码。
-
集合工厂方法:如
List.of()
、Set.of()
、Map.of()
,快速创建不可变集合。 -
改进的 Stream API:新增方法如
takeWhile
、dropWhile
。 -
接口私有方法:接口中可定义私有方法。
-
ProcessHandle API:增强对操作系统进程的控制。
-
Try-With-Resources 改进:可在 try 外声明资源。
-
@Deprecated 增强:新增
since
和forRemoval
属性。
✅ JDK 10(2018年3月)
-
局部变量类型推断(var):简化变量声明,如
var list = new ArrayList<String>()
。 -
G1 垃圾回收器并行化 Full GC:提升性能。
-
线程本地握手(Thread-Local Handshakes):优化 JVM 性能。
-
应用类数据共享(AppCDS):缩短启动时间。
✅ JDK 11(2018年9月,LTS)
-
HTTP Client API(标准化):支持 HTTP/1.1、HTTP/2、WebSocket。
-
字符串增强方法:如
isBlank()
、lines()
、repeat()
、strip()
。 -
Lambda 参数局部变量语法支持 var。
-
ZGC 垃圾收集器(实验性):低延迟、可扩展。
-
支持单文件源码运行:如
java HelloWorld.java
。 -
Flight Recorder(JFR):低开销的性能监控工具。
-
TLS 1.3 支持。
-
移除 JavaFX、Java EE 模块。
✅ JDK 12(2019年3月)
-
Switch 表达式(预览):支持箭头语法和返回值。
-
Shenandoah GC(低暂停时间垃圾回收器)。
-
G1 GC 优化:将垃圾分为强制和可选部分。
-
新增 NumberFormat、Files.mismatch() 等方法。
-
Unicode 11 支持。
✅ JDK 13(2019年9月)
-
Switch 表达式(第二次预览)。
-
文本块(Text Blocks,预览):支持多行字符串。
-
Socket API 重新实现。
-
ZGC 支持 macOS 和 Windows。
✅ JDK 14(2020年3月)
-
Switch 表达式(正式)。
-
instanceof 模式匹配(预览):简化类型判断和转换。
-
Records(预览):简化数据载体类的定义。
-
文本块(第二次预览)。
-
移除 CMS 垃圾回收器。
-
ZGC 支持 Windows/macOS。
✅ JDK 15(2020年9月)
-
密封类(Sealed Classes,预览):限制类的继承。
-
文本块(正式)。
-
Records(第二次预览)。
-
instanceof 模式匹配(第二次预览)。
-
ZGC 和 Shenandoah GC 成为正式特性。
-
移除 Nashorn JavaScript 引擎。
-
EdDSA 数字签名算法支持。
✅ JDK 16(2021年3月)
-
Records(正式)。
-
instanceof 模式匹配(正式)。
-
密封类(第二次预览)。
-
向量 API(孵化器)。
-
Unix-Domain 套接字通道支持。
-
打包工具 jpackage(正式):支持打包原生应用。
-
ZGC 并发线程处理优化。
-
弹性元空间(Elastic Metaspace)。
-
默认强封装 JDK 内部元素。
-
C++14 支持 JDK 源码。
-
GitHub 成为 OpenJDK 官方代码托管平台。
如需查看每个特性的详细用法或示例代码,我可以继续为你展开。是否需要我挑几个重点特性详细讲解?
复制
分享
java var使用
复制
分享
Java 10 开始引入的 var
并不是“动态类型”,而是局部变量类型推断。
编译器在编译期根据右侧表达式推断出具体类型,之后不可更改,仍是强类型。
一句话记忆:
“写起来像 JS,跑起来还是 Java。”
-
基本用法
java
复制
var name = "hello"; // 推断为 String
var list = new ArrayList<String>(); // 推断为 ArrayList<String>
var stream = list.stream(); // 推断为 Stream<String>
编译后等价于显式写出类型,字节码里并没有 var
这个关键字。
-
能用的地方(局部变量) ✅ 方法体内的局部变量
✅ for 循环索引
✅ try-with-resources 资源
java
复制
for (var s : List.of("a", "b")) { // s 推断为 String
System.out.println(s);
}
try (var in = new FileInputStream("file.txt")) { // in 推断为 FileInputStream
...
}
-
不能用的地方 ❌ 成员变量(字段)
❌ 方法参数、返回值类型
❌ 没有初始值的情况
❌ 数组初始化时左侧
java
复制
var x; // 编译错误:无法推断
var[] arr = {1,2,3}; // 错误,数组左侧不能写 var
-
注意点 & 最佳实践
-
保持可读性:右侧类型不明显时显式写出类型
java复制
var result = service.call(); // 不知道返回啥,最好别用 var
-
不滥用:只在“类型显而易见”的场景使用,减少视觉噪音
-
与钻石操作符配合:
java复制
var map = new HashMap<String, Integer>(); // 推断为 HashMap<String,Integer>
-
编译期验证
java
复制
var n = 10;
n = "abc"; // 编译错误: incompatible types: String cannot be converted to int
变量 n
已被推断为 int
,后续赋值必须兼容。
一句话总结
var
只是**“省键盘”**的语法糖,类型还是编译期确定,用完代码更简洁,但别让它掩盖了重要类型信息。
复制
分享
jdk18-21有什么功能
编辑
复制
分享
JDK 18 功能
JDK 21 LTS 功能 一览
下面按版本把 JDK 18 ➜ JDK 21 的主要功能/变化快速列一遍(只谈正式或预览级别的新东西,bug-fix/性能小修小补不展开)。
所有特性均可在生产环境试用,但带“预览”字样的需加 --enable-preview
编译运行,且后续版本仍可能调整。
JDK 18(2022-03,非-LTS)
-
UTF-8 默认charset(JEP 400)
启动JVM时文件编码、<javac>
编码等默认就是 UTF-8,跨平台乱码问题基本终结。 -
简易 HTTP-File Server(JEP 408)
命令行java -m jdk.httpserver [/path]
秒级把当前目录变成静态下载站,测试/临时传文件神器。 -
Vector API 第 3 孵化(JEP 417)
通过jdk.incubator.vector
在 Java 里写 SIMD,HotSpot 会编译成对应平台最佳向量指令。 -
代码片段片段化 API(Code Snippets in javadoc)(JEP 413)
写 doc 时可直接@snippet Hello.java
把源码区域嵌进文档,生成时自动语法高亮、行号。 -
互联网地址解析 SPI(JEP 418)
允许为InetAddress
提供自定义解析器(DoH、内部 DNS、Mock 等场景)。
JDK 19(2022-09,非-LTS)
-
虚拟线程(Virtual Threads)——第一次预览(JEP 425)
由 JVM 托管的轻量级线程,创建数百万个也扛得住;与旧Thread
API 100% 兼容。 -
结构化并发(Structured Concurrency)——孵化(JEP 428)
把多条虚拟线程/平台线程看成一个“工作单元”,异常传播、取消、超时更容易管理。 -
外部函数 & 内存 API(FFM)——预览(JEP 424)
安全替代 JNI,直接调用 native 库、访问堆外内存,无Unsafe
风险。 -
Vector API 第 4 孵化(JEP 426)
-
Switch 模式匹配——第三次预览(JEP 427)
支持在case
里直接写类型模式、record 解构、带when
守卫条件。 -
Linux/RISC-V 端口正式合入
官方可在 RV64 上跑 Java。
JDK 20(2023-03,非-LTS)
(全部处于“预览/孵化”阶段,为 21 LTS 做最后验证)
-
虚拟线程 —— 第二次预览(JEP 437)
继续打磨 API、调试/监控工具链。 -
结构化并发 —— 第二次孵化(JEP 437)
StructuredTaskScope
支持继承 作用域值(ScopedValue)。 -
作用域值(Scoped Values)——孵化(JEP 429)
线程安全、不可变的“局部变量”传递,可跨虚拟线程共享,替代ThreadLocal
。 -
记录模式(Record Patterns)——第二次预览(JEP 432)
可在instanceof
/switch
中直接解构记录,支持嵌套。 -
Switch 模式匹配 —— 第四次预览(JEP 433)
-
Vector API —— 第五次孵化(JEP 438)
JDK 21(2023-09,LTS)
-
虚拟线程正式落地(JEP 444)
去掉预览开关,性能、调试、线程转储、JFR 事件全部就绪;Tomcat/Jetty/Netty/Spring 6.1 等已默认支持。 -
Switch 模式匹配正式(JEP 441)
支持类型模式、记录模式、null 匹配、守卫条件;可返回值的 switch 表达式写法完整收工。 -
记录模式正式(JEP 440)
与上一条配合,可在instanceof
/switch
中直接case Point(int x, int y)
解构。 -
序列化集合接口(JEP 431)
新增SequencedCollection
、SequencedSet
、SequencedMap
,统一“有先后顺序”的集合操作:
addFirst / addLast / getFirst / getLast / reversed()
等。 -
字符串模板(预览)(JEP 430)
STR."Hello \{name},今年\{age}岁"
插值写法,告别冗长拼接;可自定义模板处理器防 SQL / XSS 注入。 -
结构化并发(预览)(JEP 453)
官方并发框架雏形,StructuredTaskScope
把子任务当成整体管理,异常/取消自动级联。 -
外部函数 & 内存 API(FFM)正式(JEP 442)
取代 JNI,性能更高、内存安全,已提供Linker
、SymbolLookup
、MemorySegment
等稳定 API。 -
分代 ZGC(JEP 439)
ZGC 支持年轻代+老年代分代收集,吞吐与内存占用大幅改善,仍保持亚毫秒级停顿。 -
未命名变量 & 模式(预览)(JEP 443)
在catch
、try-with-res
、switch
等场景用_
占位,避免起无意义变量名。 -
无名类 & 实例 main 方法(预览)(JEP 445)
学生/脚本场景可直接写void main() { println("Hi"); }
,无需public class Hello { public static...
。 -
密钥封装机制 API(JEP 452)
为后量子密码学提供标准接口,应对未来加密算法迁移。
一句话总结
-
18 是“工具/编码友好”版本;
-
19/20 把虚拟线程、FFM、模式匹配这些大招放到预览区让大家尝鲜;
-
21 LTS 把它们全部转正并补齐了并发、集合、字符串、GC 等现代能力,可放心上生产。
想体验“百万并发+简捷语法+安全调原生库”,从 21 开始即可。