Java 各版本新特性
(从 Java 5 ~ Java 21 全覆盖,语法+原理+代码示例+使用场景+面试点)
一、Java 5(里程碑,现代 Java 语法的起点)
1. 泛型(Generics)
- 目的:在编译期进行类型检查,避免运行时
ClassCastException - 语法:
List<String> list = new ArrayList<>() - 泛型擦除:
- 编译后泛型信息会被删除,字节码中是原始类型
- 运行时无泛型,泛型仅存在于源码和编译期
- 通配符:
<?>任意类型<? extends E>上界通配符(只读,生产者)<? super E>下界通配符(可写,消费者)
2. 增强 for 循环(foreach)
for (String s : list) { }
- 底层:迭代器
Iterator - 不能在遍历中增删元素(否则
ConcurrentModificationException)
3. 自动装箱 / 拆箱(Autoboxing)
- 基本类型 ↔ 包装类 自动转换
Integer a = 10;→Integer.valueOf(10)int b = a;→a.intValue()- 缓存池:
Integer[-128,127]、Byte、Short、Long、Character[0,127]
4. 枚举(Enum)
enum Season { SPRING, SUMMER }
- 本质是继承
Enum的 final 类 - 线程安全,可用于单例(最佳单例方案)
5. 注解(Annotation)
@Override、@Deprecated、@SuppressWarnings- 元注解雏形出现
6. 可变参数
void method(int... a) { }
- 本质数组
- 必须放在参数最后
7. 线程并发包(JUC 雏形)
java.util.concurrentThreadPoolExecutor、ExecutorService、CountDownLatch、Lock
二、Java 6
1. 编译器优化
- 启动性能提升
2. JDBC 4.0
- 驱动自动加载,无需
Class.forName
3. Compiler API
- 程序内动态编译 Java 代码
4. 轻量级 HTTP 服务器 com.sun.net.httpserver
5. 对脚本语言的支持(JSR 223)
- 可调用 JS、Python 等
三、Java 7(大量实用语法)
1. switch 支持 String
switch (str) {
case "A": break;
}
2. 数字字面量下划线
int a = 1_000_000;
3. 泛型类型推断(钻石运算符)
List<String> list = new ArrayList<>();
4. 多异常捕获(catch 合并)
catch (IOException | SQLException e) { }
5. try-with-resources
- 实现
AutoCloseable接口的资源自动关闭 - 彻底解决流未关闭泄漏问题
6. NIO 2.0(Path、Paths、Files)
Path path = Paths.get("a.txt");
Files.copy(in, out);
Files.deleteIfExists(path);
- 比传统 File 类更强大
7. Fork/Join 框架
- 大任务拆分,并行执行
- 适合 CPU 密集型
四、Java 8(企业核心,最重要版本,LTS)
1. Lambda 表达式
语法
(parameters) -> { statements; }
使用前提
必须是函数式接口:接口中只有一个抽象方法
@FunctionalInterface 注解用于校验
内置函数式接口(4 大核心)
Consumer<T>:void accept(T t)消费型Supplier<T>:T get()供给型Function<T,R>:R apply(T t)函数型Predicate<T>:boolean test(T t)判断型
闭包特性
Lambda 访问外部变量,默认隐式 final
2. 方法引用 / 构造器引用
- 静态方法:
类名::方法 - 实例方法:
对象::方法 - 构造方法:
类名::new
示例:
list.forEach(System.out::println);
3. Stream API
三大阶段
- 创建流
stream()、parallelStream()Stream.of()、Arrays.stream()
- 中间操作(惰性,可链式)
filter过滤map映射flatMap扁平化distinct去重sorted排序limit/skip
- 终止操作(触发执行)
forEachcollect收集(toList、joining、groupingBy)reduce归约count、min、max
特点
- 惰性求值:不调用终止操作,中间操作不执行
- 不存储数据
- 一次性使用,不能重复操作
4. Optional 类(解决 NPE)
核心方法
Optional.ofNullable(obj):允许 nullOptional.of(obj):不允许 nullisPresent():判断是否非 nullifPresent():非 null 才执行orElse():null 返回默认值orElseGet():null 执行 SupplierorElseThrow():null 抛异常map()/flatMap():链式获取深层属性
5. 全新日期时间 API(java.time)
核心类
LocalDate:日期LocalTime:时间LocalDateTime:日期+时间Instant:时间戳DateTimeFormatter:线程安全格式化Duration:时间差(秒/纳秒)Period:日期差(年月日)
优势
- 不可变类,线程安全
- 设计清晰,API 语义化
- 彻底替代
SimpleDateFormat
6. 接口默认方法(default)和静态方法
default void method() {}
static void staticMethod() {}
- 解决接口扩展兼容性问题
- 实现类可直接使用,也可重写
7. HashMap 优化
- JDK8:数组 + 链表 + 红黑树
- 链表长度 ≥8 且数组长度≥64 转为红黑树
- 退化为链表:≤6 个节点
- 尾插法替代头插法,避免并发死链
8. ConcurrentHashMap 优化
- 取消 Segment 分段锁
- 采用 CAS + synchronized
- 锁粒度更细,性能大幅提升
9. Nashorn JavaScript 引擎
- 替代 Rhino
- 可在 Java 中执行 JS
10. Base64 内置支持
java.util.Base64- 无需第三方包
五、Java 9
1. 模块化系统(Module System)
module-info.javarequires依赖模块exports导出包opens开放反射- 目的:减少内存占用、安全隔离、更快启动
2. 不可变集合工厂方法
List.of(1,2,3);
Set.of(1,2);
Map.of("k1",1,"k2",2);
- 不可变,添加删除抛
UnsupportedOperationException
3. 接口私有方法
private void method() {}
- 供默认方法复用代码
4. Stream 增强
takeWhile:满足条件就取dropWhile:满足条件就丢弃ofNullable:空安全流- 新的
iterate重载
5. Optional 增强
stream()ifPresentOrElse()or():为空则返回备选 Optional
6. JShell 交互式工具
- 直接执行代码片段,无需类和方法
7. 多分辨率图像 API
8. 响应式流(Reactive Streams)
java.util.concurrent.Flow
六、Java 10
1. 局部变量类型推断 var
var list = new ArrayList<String>();
var stream = list.stream();
使用限制
- 只能用于局部变量
- 不能用于方法参数、返回值、成员变量
- 必须初始化,不能
var a; - 不能赋值为 null
2. 不可变集合 copyOf
List.copyOf(list);
3. G1 成为默认 GC
4. 线程局部管控(Thread-Local Handshakes)
- 可单独停止一个线程,提高 Stop-The-World 效率
七、Java 11(LTS,企业主流)
1. String 增强
isBlank():是否空白strip():去除空白(支持全角,比trim强)stripLeading()/stripTrailing()lines():按行转 Streamrepeat(n):重复字符串
2. HttpClient 标准化
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder(URI.create("url")).GET().build();
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::body)
.thenAccept(System.out::println);
- 支持 HTTP/2、异步、响应式流
- 替代
HttpURLConnection
3. var 支持 Lambda 参数
(var a, var b) -> a + b
4. 启动单个 Java 源文件
java Hello.java
- 无需手动
javac编译
5. 移除 Java EE 模块
- CORBA、XML 绑定等
6. ZGC 并发垃圾收集器(实验性)
- 超低延迟 GC
7. 飞行记录器 JFR 开源
- 生产环境性能监控
8. 废弃 Nashorn
八、Java 12~Java 16(语法糖爆发期)
1. Switch 表达式(Java 12 预览 → 14 正式)
- 可返回值
- 箭头语法,无穿透,无需 break
String s = switch (a) {
case 1 -> "一";
case 2 -> "二";
default -> "其他";
};
- yield 关键字返回块内值
2. instanceof 模式匹配(Java 14 预览 → 16 正式)
if (obj instanceof String str) {
System.out.println(str.length());
}
- 自动类型转换,无需强转
3. Records 记录类(Java 14 预览 → 16 正式)
record Point(int x, int y) {}
自动生成:
- 全参构造
x()、y()访问方法equals、hashCodetoString- 不可变数据类,替代 POJO/DTO
4. 密封类(Sealed Classes,Java 15 预览 → 17 正式)
sealed class Shape permits Circle, Rectangle {}
- 限制只能指定子类继承
- 提高安全性、模式匹配完整性
5. Vector API(孵化)
- 利用 CPU 矢量指令提升计算性能
九、Java 17(最新 LTS,企业未来标准)
1. 密封类正式可用
2. 增强伪随机数生成器 API
3. 移除实验特性:AOT、Graal 试验部分
4. 模式匹配 for Switch(预览)
String result = switch (obj) {
case Integer i -> "int";
case String s -> "string";
case null -> "null";
default -> "other";
};
5. 完整的 Linux/AArch64 支持
6. 性能、安全、GC 全面升级
- G1、ZGC、Shenandoah 成熟稳定
十、Java 18~Java 21(最新稳定版)
Java 18
- 默认 UTF-8
SimpleWebServer简易 HTTP 服务- 方法句柄重新实现
Java 19
- 虚拟线程(预览)
- 模式匹配再次增强
Java 21(LTS,下一代企业标准)
1. 虚拟线程(Virtual Threads)正式
- 百万级轻量级线程
- 极低切换成本
- 代码不变,并发能力指数提升
2. 模式匹配 for Switch 正式
3. Record 模式匹配
if (obj instanceof Point(int x, int y)) {}
4. 序列集合(Sequenced Collections)
getFirst()、getLast()、reversed()
5. ZGC 无停顿 GC 成熟
6. 完整泛型模式匹配体系
十一、企业级重点总结(超详细版)
1. 现代 Java 开发必备
- Java 8:Lambda + Stream + Optional + 新日期
- Java 11:String 增强 + HttpClient + var
- Java 17:密封类 + 模式匹配 + Record
- Java 21:虚拟线程 + 完整模式匹配
2. 语法演进主线
- 简化代码:Lambda、var、Record、Switch 表达式
- 空安全:Optional、模式匹配
- 并发:JUC、虚拟线程、高性能 GC
- 安全:密封类、模块化
3. 版本选择
- 老项目:Java 8
- 中型项目:Java 11
- 新项目/微服务:Java 17 / Java 21
十二、面试深度考点(完整不精简)
- Lambda 与匿名内部类的区别
- Stream 惰性求值原理与执行流程
- Optional 为什么能避免 NPE,如何避免过度嵌套
- Java 8 日期 API 不可变性与线程安全
- 泛型擦除机制与通配符区别
- try-with-resources 自动关闭原理
- switch 表达式与传统 switch 区别
- instanceof 模式匹配带来的效率提升
- Record 实现原理与不可变性
- 密封类的设计意义与模式匹配配合
- 虚拟线程与平台线程区别
- Java 各版本 GC 演进路线